29.08.2005 11:53:29Проверка подписи Ответов: 5
Дмитрий
Потребовалось сохранить отдельно подпись от имеющегося PKCS7 файла (подпись attached). Что делаю. Достаю саму подпись (CryptMsgGetParam(,CMSG_ENCRYPTED_DIGEST,,,), достаю оттуда же сертификат к этой подписи (CryptMsgGetParam(,CMSG_CERT_PARAM,,,) и само сообщение (CryptMsgGetParam(,CMSG_CONTENT_PARAM,,,). Все это сохраняю.
Хочу затем проверить сохраненную подпись. Что делаю.
CryptImportublicKeyInfo() из сохраненного сертификата
CryptCreateHash( , CALG_GR3411, ,, )
CryptHashData() - загружаю сохраненное сообщение
CryptVerigySignature() - проверяю сохраненную подпись.
И вот тут получаю NTE_BAD_SIGNATURE, хотя делаю вроде как все по правилам. Подскажите, пожалуйста, где я неправ?
 
Ответы:
29.08.2005 17:01:20kure
По правилам проверить подпись будет правильнее в учетом формата PKCS#7.
Нужно посмотреть на RFC (например, 2315). В них попроше описан формат и процесс создания/проверки ЭЦП.
http://www.ietf.org/rfc/rfc2315.txt?number=2315
А еще для этих целей может пригодиться dumpasn1
http://www.cryptopro.ru/CryptoPro/test/dumpasn1.zip

30.08.2005 8:49:43Дмитрий
В общем-то, меня и это устроит в случае, если от "целого" pkcs#7 сообщения удастся оставить только часть с одной подписью. К сожалению, здесь никто не смог подсказать как.
31.08.2005 14:10:45kure
Так и не подсказали по причине того что что нужно сделать известно и описано в пиведенных стандартах, а осталось только упорно разбираться с возможностью реализации используя CryptoAPI.
31.08.2005 14:24:07Дмитрий
Т.е. формировать самому .p7s вручную, байт за байтом? Или что-то в CryptoAPI мне таки может помочь?
31.08.2005 14:30:11kure
В CryptoAPI может помочь функции низкого уровня. Их нужно изучить и понять, можно ли это сделать. Но сначала нужно посмотреть PKCS#7, чтобы понять как подпись формируется и как проверяется. В каком случае подписываются данные, а в каком добавляются атрибуты и т.д.
А вот байт по байту не рекомендовал бы.