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