11.10.2005 0:39:16чудеса с CRYPT_MODE_CBC Ответов: 6
quark
Коллеги, доброго времени суток!
Возник вот какой вопрос.
Мне требуется создать защищенный канал связи. В связи с этим запрограммировал один примерчик, в котором создается сеансовый ключ, который шифруется на согласованном ключе... и т.д. в общем все по классике. В данном примере в качестве режима выставлялся CRYPT_MODE_CBC режим. Все прекрасно работало. В один из дней перенес программку на другую машину и получил ошибку в момент вызова функции шифрования CryptEncrypt, в момент шифрации ПОСЛЕДНЕГО блока данных. Там возникала ошибка чтения по определенному адресу памяти. При этом, иногда, загибалась служба хранения ключей и ее приходилось перезапускать. Долго не мог понять где грабли. Потом закоментарил установку режима шифрования
//CryptSetKeyParam(hSessionKey, KP_MODE, CRYPT_MODE_CBC, 0)
и все заработало. Надо сказать , что на первой машине, где все работает, в параметрах КриптоПро выставлено хранить закрытые ключи в памяти, а на второй, где не работает, выставлено хранить в службе хранения ключей. Это так и должно быть? Или я стою в лыжах на асфальте? Неужели данный параметр сказывается на возможности использования блочного режима? Или грабли зарыты не здесь?
 
Ответы:
11.10.2005 10:28:57Василий
Где грабли - проверить просто (переключить способ хранения ключей на второй машине).
А вот разобраться, почему - вопрос. Вы учитываете тот факт, что в блочном режиме длина шифртекста больше, чем длина открытого текста? И, соответственно, буфер в CryptEncrypt надо выделять больше. Если длина открытого текста (ОТ) не кратна 8 байтам (размер блока), то буфер дополняется до кратного 8 байтам. Если длина ОТ кратна 8 байтам - добавляется ещё один блок.
11.10.2005 17:40:33quark
Так. Грабли проверил. На второй машинке, в панели управления КриптоПро, поставил опцию хранить ключики в памяти приложения. Все заработало.
Осталось понять почему :)
По поводу длинны буфера все нормально. Поставил равной 160, при этом текст для шифрования передавал совсем маленьким, ну например 10-20 символов, т.е. длины буфера для зашифрованного текста должно было хватать в избытке, но тем не менее получал ошибку чтения памяти. Если же передавал большой текст, который однозначно не помещался в буфер за один раз, то ошибка возникала именно при шифровании последнего блока данных, при этом последний блок был менее 100 символов, т.е. длины буфера в 160 символов должно было хватать и в этом случае.
Опять же, когда установлена опция хранения ключей в памяти, при прочих равных условиях,все работает, т.е. длина буфера как бы ни при чем.
Остается непонятным, почему ТАК влияет параметр указывающий как хранить секретные ключики.
11.10.2005 18:13:44Василий
Спасибо за разъяснение.
Только сообщите ещё, плиз, версию ОС, какие обновления ОС, и версию и номер сборки КриптоПро CSP.
11.10.2005 18:31:48quark
Windows XP Professional SP2
VC++ 6.0, разумеется, установлен PSDK
CryptoPro 2.0 (Build 2049)
12.10.2005 10:08:13Василий
Понятно. Если не затруднит, проверьте поведение на этой машине для нового билда CSP (который, в т.ч., специально создавался с учётом особенностей ХР SP2):

http://www.cryptopro.ru/pub/csp-2-0/cpcsp_2089.zip
14.10.2005 17:32:52quark
Спасибо, попробую... только не сейчас. У заказчика именно эта версия.