31.05.2004 17:24:02CryptEncrypt and CryptDecrypt Ответов: 5
Александр
Здравствуйте!
Создаю следующей функцией сессионный ключ.
CryptGenKey(hcryptprov,
CertOIDToAlgId("1.2.643.2.2.21"),
CRYPT_EXPORTABLE,
&hsessionkey)

шифрую на этом ключе файл.
потом открываю зашифрованный файл и расшифровываю его на сессионном ключе.
первые 8 байт не совпадают.
Что делать?
Спасибо!
 
Ответы:
31.05.2004 17:52:15uri
При каждом использовании ключа меняется значение синхровектора (IV). Поэтому, перед зашифрованием значение IV нужно сохранить, перед расшифрованием - установить.
Функции ..GetKeyParam, ..SetKeyParam, параметр KP_IV
01.06.2004 10:29:28Александр
Здравствуйте!
Делаю следующее:
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 байт всё равно расшифровывыются не правильно.
Спасибо!
01.06.2004 10:41:54uri
// это Вы определили размер вектора инициализации и отвели под него место
CryptGetKeyParam(hsessionkey, KP_IV, NULL, &dwIV, 0);
pbIV = new BYTE[dwIV];

// это Вы определили значение вектора инициализации
CryptGetKeyParam(hsessionkey, KP_IV, pbIV, &dwIV, 0);

... вот тут вы должны зашифровать данные и сессионный ключ, сохранить и передать на другую сторону зашифрованный сессионный ключ, данные, вектор инициализации и их длины.

// на другой стороне делаете всякие телодвижения и в том числе устанавливаете значение вектора инициализации
CryptSetKeyParam(hsessionkey, KP_IV, pbIV, 0);

Если не получается - смотрите, где ушли в сторону от алгоритма...
01.06.2004 11:17:22Александр
Спасибо. с этим всё ясно.
Как мне получить размер блока шифрования?
Функция
CryptEncrypt(hsessionkey, 0, 1, 0, NULL, &cbData, 0); возврашает cbData=0; хотя в MSDN написано, что cbData=размер блока шифрования.
01.06.2004 11:52:12uri
Возьмите из проекта-примера http://www.cryptopro.ru/CryptoPro/test/sample2_0.zip и посмотрите export.c
Там увидите как это делается и как вызывать CryptEncrypt