Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2019, 09: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, 11:11   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
base64 MorgunZ Общие вопросы Delphi 13 15.03.2015 00:02
Base64 GoldmasteR Общие вопросы Delphi 10 06.01.2011 18: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