Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline Konstantin  
#11 Оставлено : 24 июня 2009 г. 23:02:12(UTC)
Konstantin

Статус: Участник

Группы: Участники
Зарегистрирован: 24.09.2008(UTC)
Сообщений: 27
Мужчина
Откуда: Москва

Сказал «Спасибо»: 1 раз
ацтой :-/
Offline Юрий  
#12 Оставлено : 25 июня 2009 г. 0:56:58(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

С уважением,
Юрий Строжевский
Offline Павел Смирнов  
#13 Оставлено : 25 июня 2009 г. 13:24:00(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)  | Причина: Не указана

Техническую поддержку оказываем тут.
Наша база знаний.
Offline Юрий  
#14 Оставлено : 25 июня 2009 г. 14:54:10(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Абсолютно согласен, что термин (да и сам процесс) "расшифровка" применим только к тревиальным алгоритмам. Но для понимания собственно сущности цифровой подписи крайне наглядно представлять ее в виде простого зашифрованного хеша данных.

Насчет "Microsoft сохраняет правильно (по стандарту)": приведите мне, пожалуйста, по какому стандарту они это правильно делают? Когда-то я задавал вопрос почему же Microsoft сделала именно так на их форуме поддержки - ответ был вроде "смиритесь с фактом".
С уважением,
Юрий Строжевский
Offline Павел Смирнов  
#15 Оставлено : 25 июня 2009 г. 16:04:47(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 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 - всё будет прекрасно работать.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Юрий  
#16 Оставлено : 26 июня 2009 г. 1:40:35(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 671
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 93 раз в 67 постах
Подождите, а как же ваши слова "Переворачивать-то они переворачивают..." сочетаются с "...делаем вывод, что OCTET STRING с выхода RSA надо без каких-либо преобразований поместить как значение подписи в CMS"? Или все это еще нужно комбинировать с "на выходе из CryptSignHash() подпись перевёрнута"? Если да, то скажите, пожалуйста, откуда была получена информация, что изначально выход с CryptSignHash является перевернутой подписью?

Отредактировано пользователем 26 июня 2009 г. 1:41:20(UTC)  | Причина: Не указана

С уважением,
Юрий Строжевский
Offline Юрий  
#17 Оставлено : 26 июня 2009 г. 12:58:51(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 структурах.
С уважением,
Юрий Строжевский
Offline Павел Смирнов  
#18 Оставлено : 26 июня 2009 г. 13:09:44(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Всё верно. Только я не стал бы называть это "проблемами". Данная особенность интерфейса CryptoAPI документирована, соответственно разработчик обладает необходимой информацией для правильного использования этого интерфейса.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline Konstantin  
#19 Оставлено : 26 июня 2009 г. 15:51:58(UTC)
Konstantin

Статус: Участник

Группы: Участники
Зарегистрирован: 24.09.2008(UTC)
Сообщений: 27
Мужчина
Откуда: Москва

Сказал «Спасибо»: 1 раз
Да уж, не утешительно.

Смирнов написал:
2Konstantin: Давайте пойдём от начала. В чём заключается задача и откуда возникла необходимость получить хэш-значение исходных данных? Что мешает его посчитать по этим данным?

Этот хэш нужен в двух задачах:
1. Для представления подписи в формате XMLDSIG и/или XADES.
2. Формируем хэш на Сервере, отправляем его Клиенту, подписываем на Клиенте, отправляем подпись на Сервер, Сервер извлекает хэш из подписи и сверяет тот ли хэш был подписан.

Повторно посчитать хэш мешает то, что данные гигабайтные и их много.
Offline Павел Смирнов  
#20 Оставлено : 26 июня 2009 г. 16:07:17(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Первая задача не решаема в принципе. Нельзя просто конвертировать подпись CMS SignedData в XMLDSIG и обратно, т.к. они вычисляются по разным правилам. Даже если вы будете обладать хэш-значением исходных данных, чтобы получить валидную XMLDSIG-подпись вам надо её считать заново по правилам XMLDSIG.

Формулировка второй задачи странная. Сервер в вашей постановке не доверяет Клиенту (а вдруг он подписал не то, что я просил?). Предположим, вам удалось извлечь хэш-значение из атрибута szOID_RSA_messageDigest из того, что прислал Клиент. Вы можете сравнить его с вашим хэш-значением, но это не гарантирует, что значение подписи математически корректно. Единственным правильным способом проверки здесь является непосредственно проверка подписи по имеющемуся у сервера хэш-значению.
Техническую поддержку оказываем тут.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (7)
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.