| ||||
| ||||
Используем CryptoPro CSP 2 под Solaris. Нужно проверить подпись в формате PKCS7. Функций CryptSignMessage на Solaris нет. Выполняю следующие действия: 1. Разбираю PKCS7. 2. Вытаскиваю аттрибут ContentInfo->content 3. Вытаскиваю аттрибут SignerInfo->encryptedDigest 4. Атрибут SignerInfo->authenticatedAttributes отсутствует. Это (по стандарту pkcs7) свидетельствует о том, что в формировании хэша участвует только content. 5. Проверяю подпись по алгоритму: СPCreateHash, СPHashData, CPVerifySignature. Подпись не сходится. 6. Функция CryptVerifyMessage на Win32 утверждает, что подпись сходится. Вопрос, в чем могут заключаттся подводные камни, проявляющиеся в том, что CryptHashMessage = CryptHashData, а CryptSignMessage != CryptHashData+CryptSignData. P.S. Осуществлял проверки крипто-провайдера RSA под Win32. Ситуация та же. Если вам не трудно, объясните пожалуйста как, по вашему мнению реализована функция CryptSignMessage (без формирования pkcs7) и как она выражается чепез CryptHashData, CryptSignHash. | ||||
Ответы: | ||||
| ||||
CryptHashMessage == СryptHashData Тут я имею ввиду, что значения хеша в pkcs7 совпадает со значением хеша получаемым через СryptHashData+CryptGetHashParam. CryptSignMessage != CryptHashData + CryptSignHash Тут я имею в виду, что при подпись полученную через CryptSignMessage и развернутую из pkcs7 нельзя проверить через функции более низкого уровня: CryptHashData+CryptVerifySignature | ||||
| ||||
Вопрос - а чья реализация функций Crypt* на Solaris? В составе "КриптоПро CSP 2.0 для Solaris" их нет... | ||||
| ||||
Извините, я опечатался. Конечно я использую функции CP... : CPHashData, CPSignHash и прочее. Суть вопроса остается прежней CPHashData, CPSignHash/CPVerifySignature на Solaris совместимы с CryptHashData, CryptSignHash/CryptVerifySignature на Win32. Но почему то подпись полученная с помощью CryptSignMessage на Win32 не удается проверить с помощью функций более низкого уровня (CryptVerifySignature на Win32 или CPVerifySignature на Solaris) | ||||
| ||||
> Но почему то подпись полученная с помощью CryptSignMessage на Win32 не удается проверить с помощью функций более низкого уровня (CryptVerifySignature на Win32... Тут нужно точно знать, что именно подписывает CryptSignMessage, и в каком формате записывает подпись. Лучше, конечно, использовать функции одинакового уровня, например, CryptSignHash и CryptVerifySignature. Если Вы получите положительный результат: ЭЦП, созданная на Win с помощью CryptSignHash проверится на Solaris с помощью CPVerifySignature - можно будет разбираться с более высокоуровневой функцией CryptSignMessage. | ||||
| ||||
С этим я уже разобрался. Все Solaris-функции абсолютно совместимы с аналогичными Win32. Проблема в том, что подпись, содержащаяся в PKCS7, созданным с помощью CryptSignMessage не сходится с данными, хранящимися в том же PKCS7 при проверке низкоуровневыми функциями. Хотя высокоуровневая функция CryptVerifyMessage полностью подтверждает подпись. Вопрос формата маловерятен (хотя возможен). Скорее всего хэш для PKCS7 вычисляется как-то иначе (хотя стандарт PKCS7 утверждает, что хэш должен вычисляться именно от данных и не от чего иного, если отсутвтуют атрибуты в SignerInfo). В чем подвох, я не понимаю | ||||
| ||||
Хеш - он и в Африке хеш. Но, можно его вычислять от готового буфера данных, а можно данные преобразовать. И результат (ЭЦП) можно положить как есть, а можно закодировать. MSDN пишет так: "The CryptSignMessage function creates a hash of the specified content, signs the hash, and then encodes both the original message content and the signed hash." | ||||
| ||||
Может в этом подвох http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2958 | ||||
| ||||
Благодарю вас! Действительно, как я не заметил, что подпись в PKCS7 записана как OCTET STRING, а не BIT STRING, используемая в низкоуровневых функциях | ||||
| ||||
Hi! Nice site! I wish you well! | ||||