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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 11.06.2019, 10:34   #1
gerdal
Новичок
 
Регистрация: 11.06.2019
Сообщений: 1
Репутация: 10
По умолчанию 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
Сообщений: 14,479
Репутация: 2631
По умолчанию

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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


23:44.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru