Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 11.06.2019, 10:34   #1
gerdal
Новичок
Джуниор
 
Регистрация: 11.06.2019
Сообщений: 1
По умолчанию CryptBinaryToString Base64 + RSA

Пишу обычный шифратор текста при помощи рса.
Генерация и экспорт ключа работают.
Надо ключи рса преобразовать в строку, выбрал base64 посредством winapi.
и вот, есть такой код
Код:
#include <Windows.h>
#include <WinCrypt.h>
#include <string>
#include <iostream>
#pragma comment (lib, "crypt32.lib")
#include <stdio.h>
 
BOOL success = TRUE;
HCRYPTPROV hProv;
HCRYPTKEY hKey;
DWORD dwprLen;
BYTE* prKeyBlob;
DWORD dwpbLen;
BYTE* pbKeyBlob;
 
LPSTR PublicKey;
LPSTR PrivateKey;
 
BOOL GenerateKey()
{
    if (!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) &&
        !CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
    {
        printf("Can't create contex! %d\n", GetLastError());
        return FALSE;
    }
    if (!CryptGenKey(hProv, AT_KEYEXCHANGE, 2048 << 16 | CRYPT_EXPORTABLE, &hKey))
    {
        printf("Can't create RSA key pair %d\n", GetLastError());
        success = FALSE;
    }
 
    return success;
}
 
BOOL ExportPrivateKey()
{
    if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwprLen))
    {
        printf("Can't export RSA key pair. Error:%x\n", GetLastError());
        success = FALSE;
    }
    if (!(prKeyBlob = (BYTE*)malloc(dwprLen)))
    {
        printf("Out of memory\n");
        success = FALSE;
    }
    if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, prKeyBlob, &dwprLen))
    {
        printf("Can't export RSA key pair\n");
        success = FALSE;
    }
    for (DWORD i = 0; i < dwprLen; i++)
    {
        printf("%02c", prKeyBlob[i]);
    }
    std::string key(reinterpret_cast<char const*>(prKeyBlob));
    for (int i = 0; i < strlen(key.c_str()); i++)
    {
        printf("%c", key[i]);
    }
    printf("\n");
    printf("\n");
    return success;
}
 
BOOL ExportPublicKey()
{
    if (!CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, NULL, &dwpbLen))
    {
        printf("Can't export RSA key pair %d\n", GetLastError());
        success = FALSE;
    }
    if (!(pbKeyBlob = (LPBYTE)malloc(dwpbLen)))
    {
        printf("Out of memory %d\n", GetLastError());
        success = FALSE;
    }
    if (!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwpbLen))
    {
        printf("Can't export RSA key pair %d\n", GetLastError());
        success = FALSE;
    }
    for (DWORD i = 0; i < dwpbLen; i++)
    {
        printf("%02c", pbKeyBlob[i]);
    }
    printf("\n");
    printf("\n");
    return success;
}
 
void Encode()
{
    DWORD dlen = 0;
    if (!CryptBinaryToString(pbKeyBlob, dwpbLen, CRYPT_STRING_BASE64, NULL, &dlen))
    {
        printf("Error while getting size... %d\n", GetLastError());
    }
    if (!CryptBinaryToString(pbKeyBlob, dwpbLen, CRYPT_STRING_BASE64, PublicKey, &dlen))
    {
        printf("Error while converting to base64 string... %d\n", GetLastError());
    }
    printf("Base64: %s\n", PublicKey);
}
 
int main(void)
{
    GenerateKey();
    ExportPrivateKey();
    ExportPublicKey();
    Encode();
}
Но когда я запускаю, я получаю: "Base64: (null)"
Что не так?
gerdal вне форума   Ответить с цитированием
Старый 11.06.2019, 12:11   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,095
По умолчанию

PublicKey - это указатель, вы обязаны выделить достаточное кол-во памяти... вы ведь для это сначала с нулом вызывали функцию?..
Запомните раз и навсегда: помочь != "решите за меня"!
p51x вне форума   Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
base64 MorgunZ Общие вопросы Delphi 13 15.03.2015 01:02
Base64 GoldmasteR Общие вопросы Delphi 10 06.01.2011 19:37
base64 beemoto Общие вопросы Delphi 0 24.04.2010 21:58
base64 Dimarik Win Api 0 10.04.2010 18:59
base64 BlackOmen Общие вопросы Delphi 2 02.05.2008 16:30