#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, я прав?
Реализация:
- Загрузите сертификат:
d2i_X509_fp()
функция. Теперь у меня есть сертификат. - Получить открытый ключ сертификата:
X509_extract_key
, теперь у меня есть открытый ключ. - Теперь я хочу загрузить file_signature, чтобы расшифровать его с помощью открытого ключа, НО file_signature имеет формат ASN1 DER как я могу его загрузить, какую функцию в OpenSSL мне следует использовать?
- Предположим, я прочитал file_signature, теперь я должен расшифровать его, используя мой открытый ключ, есть ли какой-либо API для этой цели?
- Предположим, я расшифровываю file_signature и получаю hash_1.
- Теперь я должен загрузить file_data и получить его хэш с помощью функции SHA1 hash_2, какую функцию я должен использовать?
SHA1()
илиSHA1_Init, SHA1_Update, SHA1_Finish
? - Предположим, я получаю hash_1 и hash_2, как я должен их сравнивать, используя
memcmp
? - Предположим, я сравниваю их, если они равны, я могу использовать 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», чтобы выглядеть более профессионально.