Добрый день. Мне надо достать сгенеренный сессионный ключ. Но возникает проблема на этапе Получения дескриптора ключа.
Код:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
void printErr()
{
cout << "--Error--" << std::endl;
getch();
return;
}
int main()
{
///////************************************************///////
HCRYPTPROV hProv = NULL;
HCRYPTKEY hSessionKey, hPublicKey;
std::cout << "Action " << "Status" << std::endl;
std::cout << "----------------------------------------------" << std::endl;
// Получение контекста криптопровайдера
std::cout << "Cryptographic provider initializing ";
if (!CryptAcquireContext(&hProv, NULL, NULL,
PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) printErr();
else std::cout << "--Ok--" << std::endl;
// Генерация сессионного ключа
std::cout << "Session encryption key generating ";
if (!CryptGenKey(hProv, CALG_RC4, CRYPT_EXPORTABLE,
&hSessionKey)) printErr();
else std::cout << "--Ok--" << std::endl;
//Получение дескриптора открытого ключа
std::cout << "Reseiving descriptor of pulic key ";
if (!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hSessionKey)) printErr();
else std::cout << "--Ok--" << std::endl;
DWORD dlen = 16;
//CryptExportKey(hSessionKey, 0, PLAINTEXTKEYBLOB, 0, NULL, &dlen);
//BYTE* data = new BYTE[dlen];
BYTE data[1000];
CryptExportKey(hSessionKey, NULL, PLAINTEXTKEYBLOB, NULL, data, &dlen);
// Вывод ключа
std::cout << "Session key: " << data << std::endl;
// Данные для шифрования
char string[]="Test123";
std::cout << "Source string: " << string << std::endl;
DWORD count=strlen(string);
// Шифрование данных
std::cout << "Encryption completing ";
if (!CryptEncrypt(hSessionKey, 0, true, 0, (BYTE*)string,
&count, strlen(string))) printErr();
else std::cout << "--Ok--" << std::endl;
// Тестовый вывод на экран
std::cout << "Encrypted string: " << string << std::endl;
//----------------------
// Дешифрование данных
std::cout << "Decryption completing ";
if(!CryptDecrypt(hSessionKey, 0, true, 0, (BYTE*)string, &count)) printErr();
else std::cout << "--Ok--" << std::endl;
// Тестовый вывод на экран
std::cout << "Decrypted string: " << string << std::endl;
///////************************************************////////////////
getch();
//////////////////////////////////////////////////////////////
// Уничтожение дескриптора открытого ключа.
if(hSessionKey) CryptDestroyKey(hSessionKey);
// Освобождение дескриптора провайдера.
if(hProv) CryptReleaseContext(hProv, 0);
return 0;
}
Не ясно, почему на этом этапе ошибка. Перепробовал разными способами все делать, не меняется результат.