Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
Все из всего можно вытащить :) В данном случае лучше пользоваться более низкоуровневыми функциями типа CryptMsgDecode. В общем случае можно предложить следующую последовательность извлечения любых ASN.1-кодированных данных: с помощью скажем DUMPASN1 получить внутреннюю структуру сообщения и потом с помощью CryptMsgDecode последовательно декодировать все элементы сообщения. В случае же с подписью все немного сложнее: Microsoft как обычно решила делать не по стандарту, а как ей захотелось и саму подпись в ASN.1 сообщении сохраняет в так называемом "little-endian" формате. Проще говоря подпись перед добавлением в сообщение переворачивается: первый байт становится последним, второй - предпоследним и так далее. Таким образом для получения хеша сообщения из подписи необходимо раскодировать ASN.1 сообщение (как здесь уже упоминалось скорее всего сама подпись будет храниться в OCTET_STRING), перевернуть подпись, расшифровать полученные данные и как результат получить хеш сообщения. Отредактировано пользователем 25 июня 2009 г. 1:13:12(UTC)
| Причина: Не указана |
С уважением, Юрий Строжевский |
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Хэш-значение не хранится в сообщении, поэтому вытащить путём декодирования всё равно не получится. Саму подпись можно достать и проще: CryptMsgGetParam(CMSG_ENCRYPTED_DIGEST). А вот расшифровать в случае с ГОСТовыми подписями (да и любыми Эль-Гамаль-подобными) не получится. Для RSA-подписи это сделать можно, только я боюсь в CryptoAPI это будет нетривиальной задачей, т.к. нужно открытый ключ с закрытым поменять местами. Кстати, подпись в CMS-сообщении Microsoft сохраняет правильно (по стандарту), иначе их реализация CMS ни с кем бы навстречу не работала. Переворачивать-то они переворачивают, но лишь потому что на выходе из CryptSignHash() подпись перевёрнута. Почему это так - это отдельный вопрос, но к стандартам он не имеет отношения. 2Konstantin: Давайте пойдём от начала. В чём заключается задача и откуда возникла необходимость получить хэш-значение исходных данных? Что мешает его посчитать по этим данным? Отредактировано пользователем 25 июня 2009 г. 13:27:39(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
Абсолютно согласен, что термин (да и сам процесс) "расшифровка" применим только к тревиальным алгоритмам. Но для понимания собственно сущности цифровой подписи крайне наглядно представлять ее в виде простого зашифрованного хеша данных.
Насчет "Microsoft сохраняет правильно (по стандарту)": приведите мне, пожалуйста, по какому стандарту они это правильно делают? Когда-то я задавал вопрос почему же Microsoft сделала именно так на их форуме поддержки - ответ был вроде "смиритесь с фактом". |
С уважением, Юрий Строжевский |
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Последний стандарт на CMS - это RFC3852. Раздел 5.5 говорит о том, что подпись надо представить в виде OCTET STRING, а за подробностями отсылает к описаниям конкретных алгоритмов. Теперь смотрим RFC3370 под названием "Cryptographic Message Syntax (CMS) Algorithms", находим, например, раздел про RSA ( 3.2), и делаем вывод, что OCTET STRING с выхода RSA надо без каких-либо преобразований поместить как значение подписи в CMS. Именно так CryptoAPI и делает. Можете проверить это буквально, посчитав подпись RSA с помощью вашей любимой криптографической библиотеки (ну или с помощью калькулятора ;). Можете по-другому - подпишите письмо сертификатом RSA в Outlook/Outlook Express и проверьте подпись, например, в The Bat! без помощи CryptoAPI - всё будет прекрасно работать. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
Подождите, а как же ваши слова "Переворачивать-то они переворачивают..." сочетаются с "...делаем вывод, что OCTET STRING с выхода RSA надо без каких-либо преобразований поместить как значение подписи в CMS"? Или все это еще нужно комбинировать с "на выходе из CryptSignHash() подпись перевёрнута"? Если да, то скажите, пожалуйста, откуда была получена информация, что изначально выход с CryptSignHash является перевернутой подписью? Отредактировано пользователем 26 июня 2009 г. 1:41:20(UTC)
| Причина: Не указана |
С уважением, Юрий Строжевский |
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.01.2008(UTC) Сообщений: 671 Откуда: Йошкар-Ола Сказал «Спасибо»: 3 раз Поблагодарили: 93 раз в 67 постах
|
Посмотрел еще информацию по CryptVerifySignature: похоже это проблемы native CryptoAPI с использованием "little-endian" формата. И "исправилась" Microsoft только в .NET Framework:
If you generate a signature by using the .NET Framework APIs and try to verify it by using the CryptVerifySignature function, the function will fail and GetLastError will return NTE_BAD_SIGNATURE. This is due to the different byte orders between the native Win32 API and the .NET Framework API.
The native cryptography API uses little-endian byte order while the .NET Framework API uses big-endian byte order. If you are verifying a signature generated by using a .NET Framework API, you must swap the order of signature bytes before calling the CryptVerifySignature function to verify the signature.
Таким образом я соглашаюсь, что Microsoft формирует конечную подпись в PKCS сообщениях правильно если используются высокоуровневые функции. При использовании же низкоуровневых функций типа CryptMsgEncode необходимо переворачивать выход CryptSignHash перед сохранением его в ASN.1 структурах. |
С уважением, Юрий Строжевский |
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Всё верно. Только я не стал бы называть это "проблемами". Данная особенность интерфейса CryptoAPI документирована, соответственно разработчик обладает необходимой информацией для правильного использования этого интерфейса. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 24.09.2008(UTC) Сообщений: 27 Откуда: Москва Сказал «Спасибо»: 1 раз
|
Да уж, не утешительно. Смирнов написал: 2Konstantin: Давайте пойдём от начала. В чём заключается задача и откуда возникла необходимость получить хэш-значение исходных данных? Что мешает его посчитать по этим данным?
Этот хэш нужен в двух задачах: 1. Для представления подписи в формате XMLDSIG и/или XADES. 2. Формируем хэш на Сервере, отправляем его Клиенту, подписываем на Клиенте, отправляем подпись на Сервер, Сервер извлекает хэш из подписи и сверяет тот ли хэш был подписан. Повторно посчитать хэш мешает то, что данные гигабайтные и их много.
|
|
|
|
Статус: Вам и не снилось
Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC) Сообщений: 831 Откуда: Крипто-Про
Сказал(а) «Спасибо»: 1 раз Поблагодарили: 48 раз в 44 постах
|
Первая задача не решаема в принципе. Нельзя просто конвертировать подпись CMS SignedData в XMLDSIG и обратно, т.к. они вычисляются по разным правилам. Даже если вы будете обладать хэш-значением исходных данных, чтобы получить валидную XMLDSIG-подпись вам надо её считать заново по правилам XMLDSIG.
Формулировка второй задачи странная. Сервер в вашей постановке не доверяет Клиенту (а вдруг он подписал не то, что я просил?). Предположим, вам удалось извлечь хэш-значение из атрибута szOID_RSA_messageDigest из того, что прислал Клиент. Вы можете сравнить его с вашим хэш-значением, но это не гарантирует, что значение подписи математически корректно. Единственным правильным способом проверки здесь является непосредственно проверка подписи по имеющемуся у сервера хэш-значению. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close