Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline e.kapkov  
#1 Оставлено : 26 октября 2021 г. 11:32:48(UTC)
e.kapkov

Статус: Новичок

Группы: Участники
Зарегистрирован: 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 - не совпадает с зашифрованным.

что я пропустил или порядок действие не верный ?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.