Проверьте правильность файла с помощью SHA1withRSA через функции openssl

#c #cryptography #openssl #x509

#c #криптография #openssl ( опенссл ) #x509 #openssl

Вопрос:

Привет, у меня есть file_data (формат xml) и file_signature (ASN1 DER), а также есть сертификат (X509 ASN1 DER). Я хочу проверить, корректны ли file_data, но у меня возникли некоторые проблемы. что я делаю:

Основная идея: Какая-то компания A создает file_data, затем с помощью SHA1 получает хэш file_data и шифрует этот хэш с помощью закрытого ключа RSA и получает file_signature. Затем компания A отправляет мне file_data и file_signature и сертификат. Я получаю открытый ключ из сертификата, получаю file_signature и расшифровываю file_signature с помощью открытого ключа и получаю hash_1. Затем я получаю file_data и использую SHA1 для получения hash_2. Если hash_1 и hash_2 равны, я могу доверять содержимому file_data, я прав?

Реализация:

  1. Загрузите сертификат: d2i_X509_fp() функция. Теперь у меня есть сертификат.
  2. Получить открытый ключ сертификата: X509_extract_key , теперь у меня есть открытый ключ.
  3. Теперь я хочу загрузить file_signature, чтобы расшифровать его с помощью открытого ключа, НО file_signature имеет формат ASN1 DER как я могу его загрузить, какую функцию в OpenSSL мне следует использовать?
  4. Предположим, я прочитал file_signature, теперь я должен расшифровать его, используя мой открытый ключ, есть ли какой-либо API для этой цели?
  5. Предположим, я расшифровываю file_signature и получаю hash_1.
  6. Теперь я должен загрузить file_data и получить его хэш с помощью функции SHA1 hash_2, какую функцию я должен использовать? SHA1() или SHA1_Init, SHA1_Update, SHA1_Finish ?
  7. Предположим, я получаю hash_1 и hash_2, как я должен их сравнивать, используя memcmp ?
  8. Предположим, я сравниваю их, если они равны, я могу использовать file_data.

другой вопрос заключается в том, что file_signature имеет 128-байтовый len, и когда я расшифровываю его, я получаю 128-байтовый hash_1 (я прав), но когда я получаю хэш file_data hash_2, его длина составляет всего 20 байт, так как я могу их сравнить, или я что-то неправильно понимаю?

Спасибо за вашу помощь! p.s. извините за мой английский;).

Комментарии:

1. ASN1 DER не является форматом подписи. ASN.1 — это стандарт, используемый для описания структур данных. DER (Distincted Encoding Rules) — это спецификация для кодирования структуры ASN.1. Есть ли у вас какая-либо другая информация о формате подписи (raw RSA / PKCS 1, CMS …)?

Ответ №1:

Если вы получаете file_signature размером 128 байт, то, вероятно, он не закодирован в ASN.1. 128 бит — это в точности длина ключа 1024-битного ключа (в настоящее время на нижней стороне, проверьте keylength.com ). Хэши не шифруются напрямую, если используется RSA: сначала они заключаются в структуру ASN.1, а затем дополняются, все в соответствии с PKCS # 1 версии v1.5 (погуглите).

Обычно вы не выполняете хэширование отдельно от шифрования RSA. Библиотеки, подобные openssl, будут содержать функции для выполнения проверки, где хэш вычисляется автоматически (без сомнения, это будет openssl_verify()). Эти функции также выполнят сравнение за вас.

Обратите внимание, что вам нужно будет установить доверие к открытому ключу, иначе злоумышленник может просто сгенерировать случайную пару ключей и отправить вам другой открытый ключ вместе с подписанными злоумышленниками данными. Обычно открытые ключи доверяются с помощью предварительной прямой связи или с использованием инфраструктуры PKI (цепочки сертификатов).

Комментарии:

1. PS ваш английский в порядке — используйте заглавные буквы для «I», чтобы выглядеть более профессионально.