Проверьте правильность файла, используя sha1withRsa через функции openssl - PullRequest
1 голос
/ 12 апреля 2011

Привет, у меня есть 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 байт, и когда я расшифровываю ее, я получаю 128 байт hash_1 (я правильно понял), но когда я получаю хэш file_data hash_2, его длина составляет всего 20 байтов, так как я могу сравнить или я что-то не так понял?

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

1 Ответ

0 голосов
/ 01 мая 2011

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

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

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

...