Проверка подписанных исполняемых файлов и библиотек DLL Authenticode с помощью OpenSSL API

Я установил openssl, и теперь rsa_test.c работает нормально. Что я хочу сделать:

  1. Откройте любой цифровой сертификат exe или dll. Извлеките отпечаток и PublicKey. Открытый ключ также содержит показатель степени (если вы знакомы с кодировкой ASN1).

  2. Я уже рассчитал хэш файла SHA-1 и сравнил его с полем MD, чтобы найти его правильным. Итак, теперь я хочу передать отпечаток, PublicKey-> m и PublicKey-> e в функцию RSA_public_decrypt для вычислить расшифрованный хэш файла SHA-1.

Какой алгоритм заполнения я должен передать функции? Когда я передаю RSA_NO_PADDING, он расшифровывает, но дает мне 128-байтовый хэш, который совсем не верен. Для всех других параметров алгоритма заполнения он возвращает ошибку отсутствия заполнения.

Не могли бы вы научить меня или указать правильные параметры для передачи функции с примером или хорошей ссылкой на пример?


person Community    schedule 16.10.2012    source источник
comment
хороший вопрос: я предлагаю также разместить ваш вопрос на security.stackexchange.com ...   -  person Grijesh Chauhan    schedule 16.10.2012
comment
Не могли бы вы просто опубликовать такую ​​расшифрованную подпись RSA размером 128 байт?   -  person Robert    schedule 16.10.2012
comment
@ WhozCraig - Я сделал это вручную, согласно коду, приведенному в RFC. Но я удалил соответствующие области, как описано в документации Authenticode. Хеш правильный, поскольку я проверил его с полем MD сертификата.   -  person    schedule 16.10.2012
comment
Хороший вопрос: я думаю, что это наиболее распространенная проблема, с которой каждый день сталкивается множество программистов, пытающихся использовать OpenSSL для проверки подписи.   -  person Abhineet    schedule 16.10.2012
comment
в man для RSA_public_decrypt сказано: Эта функция не обрабатывает алгоритм алгоритма, указанный в PKCS # 1. При создании или проверке подписей PKCS # 1 следует использовать rsa_sign (3) и rsa_verify (3). Если вы все еще хотите использовать функцию дешифрования (почему?), Убедитесь, что у вас правильный порядок байтов для m, e и зашифрованного дайджеста.   -  person Rostislav Kondratenko    schedule 17.10.2012
comment
Также см. Windows Authenticode Portable от Microsoft. Формат исполняемой подписи.   -  person jww    schedule 16.03.2015


Ответы (1)


Для проверки всего блока подписанных данных PKCS # 7 следует использовать функцию PKCS7_verify.

Для полной проверки подписи потребуется два шага (см. спецификации Microsoft):

  1. Проверьте целостность и идентичность подписи PKCS # 7.
  2. Рассчитайте дайджест сообщения и сравните его с указанным в подписи.

Обратите внимание, что в спецификациях дайджест не ограничивается SHA-1. Алгоритм дайджеста содержится в поле digestAlgorithm в подписи.

person Rostislav Kondratenko    schedule 16.10.2012
comment
Я ценю совет, но не хочу проверять его таким образом. Я просто хочу расшифровать RSA-шифрованный хеш Sha1. Есть идеи по этому поводу ??? - person ; 17.10.2012
comment
Вопрос, который он задал, и ваш ответ не взаимосвязаны. - person Abhineet; 17.10.2012
comment
@Abhineet Ответ хорош. Это, безусловно, было бы разумным подходом к проблеме, и OP может быть полезно увидеть альтернативное (возможно лучшее) решение. - person Duncan Jones; 17.10.2012
comment
@ DuncanJones: Да, подход к проверке хорош. Всегда лучше выполнять сложный процесс проверки, используя стандартный код и библиотеку. Но почему никто не может дать прямого ответа на этот вопрос. Даже я пытался погуглить и искал везде, но не смог найти идеального решения. А теперь даже жду ответа на этот вопрос :-) - person Abhineet; 17.10.2012
comment
@Abhineet: PKCS7 signedData - это DER-кодировка относительно сложной структуры ASN.1. Вы действительно хотите использовать функцию, поддерживающую PKCS7, для выполнения всего необходимого декодирования DER. Единственный другой ответ - это сделать все болезненное декодирование DER самостоятельно, чтобы добраться до битов подписи, а затем применить метод RSA_public_decrypt. - person President James K. Polk; 17.10.2012
comment
@ GregS- Я все это сделал. У меня есть ASN_Parser и SHA1_Generator, которые я написал сам. Пытаюсь использовать решение, которое предоставил Ростислав Кондратенко. Любой пример или образец использования функции PKCS7_Verify? - person ; 18.10.2012
comment
@Abhineet: Я не нашел примеров, которые могли бы проиллюстрировать весь процесс. Интерфейс довольно простой. Вы вызываете как int isVaild = PKCS7_verify (p7, trust_certs, ca_store, NULL, NULL, 0); // или другая комбинация доверенных_цертов, ca_store и флагов в зависимости от вашего случая. Структура PKCS7 заполняется p7 = d2i_PKCS7_bio (in, NULL); коллекции сертификатов по тому, что конкретно в вашем случае. Что именно вызывает проблемы? - person Rostislav Kondratenko; 18.10.2012
comment
@ RostislavKondratenko- Эй, это не мой вопрос. Попросите пользователя 1696837 определить проблемы. Я просто слежу за этим вопросом. :-D - person Abhineet; 18.10.2012
comment
+1 за откровенный совет по использованию PKCS7_verify. @ Abhineet - Хотя мне трудно использовать PKCS7_verify, но это намного проще, чем использование функции RSA_public_decrypt. - person ; 18.10.2012
comment
@ RostislavKondratenko - есть ли у вас в рукаве какой-нибудь пример, который вы можете опубликовать здесь, показывая, как передавать параметры и заполнять эти структуры, а также тип файла, который функция примет? - person ; 18.10.2012
comment
@ user1696837 К сожалению, нет. Сам никогда этого не делал. В Интернете есть примеры того, как читать PKCS7, как читать коллекцию сертификатов, но даже в примере кода OpenSSL они не используют функцию PKCS7_verify. - person Rostislav Kondratenko; 18.10.2012
comment
Позвольте мне попробовать функцию PKCS7_verify, и если не удастся, опубликую вопрос об использовании функции. @ RostislavKondratenko- +1 за ваши старания. - person Abhineet; 19.10.2012
comment
@ Abhineet: Спасибо за помощь. - person ; 19.10.2012
comment
@ RostislavKondratenko - Спасибо за помощь. - person ; 19.10.2012
comment
@ user1696837 у вас получилось с PKCS7_verify? - person jweyrich; 02.01.2013
comment
@ jweyrich- Нет, чувак, я все еще борюсь :-( - person ; 05.01.2013