Доброго времени суток! Мне нужно экспортировать ключ в файл. Использую для этого CryptExportKey. Вот код программы:
| Код | #define _WIN32_WINNT 0x0400
#include <iostream> #include <stdlib.h> #include <fstream> #include <Windows.h> #include <WinCrypt.h> #pragma comment(lib, "advapi32.lib") #include <WinError.h> #include <string>
using namespace std;
int errorReturn() { cout << hex << GetLastError() << endl; //cin.get(); return 1; }
int main(int argc, char* argv[]){ ofstream passOfs; passOfs.open("password"); HCRYPTPROV hProv = 0; // Получение контекста криптопровайдера if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { cout << "CryptAcquireContext Error"; //cin.get(); exit(1); } HCRYPTKEY hSessionKey = 0; // Генерация сессионного ключа if (!CryptGenKey(hProv, CALG_RC2, CRYPT_EXPORTABLE, &hSessionKey)) { cout << "CryptGenKey Error"; //cin.get(); return 1; } else { std::cout << "Session key generated" << std::endl; std::cout << hSessionKey << std::endl; }
HCRYPTKEY hPublicKey = NULL; HCRYPTHASH hPassHash = NULL; //Функция создающая хеш-объект, предназначенный для генерации хеш-значения данных. if (CryptCreateHash(hProv, CALG_MD5, NULL, 0, &hPassHash)) { cout << "Hash for public key generated" << endl; cout << hPassHash << endl; } else { cout << "Hash creation fail"; exit(1); } //Основная функция хеширования данных. char password[] = "12345"; if (!CryptHashData(hPassHash, (BYTE*) password, strlen(password), 0)) { cout<< "Error CryptHashData"; } else { cout << "CryptHashData generated" << endl; } // Генерация сессионного ключа if (!CryptDeriveKey(hProv, CALG_3DES, hPassHash, CRYPT_EXPORTABLE, &hPublicKey)) { cout << "CryptDerKey Error"; return 1; } else { std::cout << "Derive session key generated" << std::endl; std::cout << hPublicKey << std::endl; }
DWORD count = 0; if (!CryptExportKey(hSessionKey, hPublicKey, SIMPLEBLOB, 0, NULL, &count)) { cout << "Error Initial of CryptExportKey: "; errorReturn(); return 1; } cout << "count " << count << endl;
BYTE* pdDataKey = new BYTE[count]; if (!CryptExportKey(hSessionKey, hPublicKey, SIMPLEBLOB, 0, pdDataKey, &count)) { cout << "Error CryptExportKey: "; errorReturn(); return 1; } cout << "data " << pdDataKey << endl;
passOfs.write((char*) pdDataKey, count); passOfs.close(); }
|
На функции CryptExportKey программа выдаёт ошибку 80090003 (NTE_BAD_KEY), что, мол, непорядок с ключами. Почему, в чем ошибка? |