Статус: Новичок
Группы: Участники
Зарегистрирован: 26.10.2021(UTC) Сообщений: 2
|
Пытаюсь дешифровать текст полученный от ISymmetricAlgorithm В документации (Метод ISymmetricAlgorithm::ImportKey) написано: Цитата: Данные, содержащие зашифрованный ключ, а также данные параметров шифрования и данные, необходимые для последующего расшифрования ключа с помощью метода ImportKey. Экспорт ключа производится с помощью вызова CryptExportKey(CALG_PRO_EXPORT) для сертификата с ключом ГОСТ Р 34.10-2001 или CryptExportKey(CALG_PRO12_EXPORT) для сертификата с ключом ГОСТ Р 34.10-2012. Данные возвращаются в виде строки шестнадцатеричных цифр, группами по две цифры на байт, разделённых пробелами. Данные содержат три компонента, разделённые символом ":":
Параметры шифрования ключа обмена. Компонент является результатом выполнения CryptGetKeyParam(KP_CIPHEROID).
Эфемерный открытый ключ, который использовался для выработки ключа обмена. Компонент является результатом выполнения CryptExportKey(PUBLICKEYBLOBEX).
Симметричный ключ, зашифрованный на ключе обмена. Компонент является результатом выполнения CryptExportKey(SIMPLEBLOB).
За основу взял пример DecryptFileкод почистил от лишних проверок и конвертации компонент ключа из строки Код:
HCRYPTPROV hCryptProv;
std::string containerName;
std::vector<BYTE> iv; // вектор инициализации
std::vector<BYTE> pbKP_CIPHEROID; // параметры KP_CIPHEROID
std::vector<BYTE> pbEphPublicKeyBlob; // Указатель на ключевой BLOB
std::vector<BYTE> pbSessionKeyBlobSimple; // Указатель на сессионный ключевой BLOB
HCRYPTKEY hKey; // Дескриптор закрытого ключа
HCRYPTKEY hSessionKey; // Дескриптор сессионного ключа
HCRYPTKEY hAgreeKey; // Дескриптор ключа согласования
CryptAcquireContext(&hCryptProv, containerName.c_str(), NULL, PROV_GOST_2012_256, 0);
// Получение дескриптора закрытого ключа получателя.
CryptGetUserKey(hCryptProv, AT_KEYEXCHANGE, &hKey);
//Эфемерный открытый ключ, который использовался для выработки ключа обмена
CryptImportKey(hCryptProv, &pbEphPublicKeyBlob[0], pbEphPublicKeyBlob.size(), hKey, 0, &hAgreeKey);
// Установление PRO12_EXPORT алгоритма ключа согласования
ALG_ID ke_alg = CALG_PRO12_EXPORT;
CryptSetKeyParam(hAgreeKey,KP_ALGID,(LPBYTE)&ke_alg,0);
// Симметричный ключ, зашифрованный на ключе обмена
CryptImportKey(hCryptProv,&pbSessionKeyBlobSimple[0], pbSessionKeyBlobSimple.size(), hAgreeKey, 0, &hSessionKey);
//Установка вектора инициализации
CryptSetKeyParam( hSessionKey, KP_IV, &iv[0], 0);
Получаю сессионный ключ, дешифрую текст методом CryptDecrypt - не совпадает с зашифрованным. что я пропустил или порядок действие не верный ?
|