| ||||
| ||||
Здравствуйте! Создаю следующей функцией сессионный ключ. CryptGenKey(hcryptprov, CertOIDToAlgId("1.2.643.2.2.21"), CRYPT_EXPORTABLE, &hsessionkey) шифрую на этом ключе файл. потом открываю зашифрованный файл и расшифровываю его на сессионном ключе. первые 8 байт не совпадают. Что делать? Спасибо! | ||||
Ответы: | ||||
| ||||
При каждом использовании ключа меняется значение синхровектора (IV). Поэтому, перед зашифрованием значение IV нужно сохранить, перед расшифрованием - установить. Функции ..GetKeyParam, ..SetKeyParam, параметр KP_IV | ||||
| ||||
Здравствуйте! Делаю следующее: CryptGetKeyParam(hsessionkey, KP_IV, NULL, &dwIV, 0); pbIV = new BYTE[dwIV]; CryptGetKeyParam(hsessionkey, KP_IV, pbIV, &dwIV, 0); CryptSetKeyParam(hsessionkey, KP_IV, pbIV, 0); первые 8 байт всё равно расшифровывыются не правильно. Спасибо! | ||||
| ||||
// это Вы определили размер вектора инициализации и отвели под него место CryptGetKeyParam(hsessionkey, KP_IV, NULL, &dwIV, 0); pbIV = new BYTE[dwIV]; // это Вы определили значение вектора инициализации CryptGetKeyParam(hsessionkey, KP_IV, pbIV, &dwIV, 0); ... вот тут вы должны зашифровать данные и сессионный ключ, сохранить и передать на другую сторону зашифрованный сессионный ключ, данные, вектор инициализации и их длины. // на другой стороне делаете всякие телодвижения и в том числе устанавливаете значение вектора инициализации CryptSetKeyParam(hsessionkey, KP_IV, pbIV, 0); Если не получается - смотрите, где ушли в сторону от алгоритма... | ||||
| ||||
Спасибо. с этим всё ясно. Как мне получить размер блока шифрования? Функция CryptEncrypt(hsessionkey, 0, 1, 0, NULL, &cbData, 0); возврашает cbData=0; хотя в MSDN написано, что cbData=размер блока шифрования. | ||||
| ||||
Возьмите из проекта-примера http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip и посмотрите export.c Там увидите как это делается и как вызывать CryptEncrypt | ||||