Как вычислить значение RSA-SHA1 (sha1WithRSAEncryption) с OpenSSL

Я запутался в RSA-SHA1, я подумал, что это RSA_private_encrypt (SHA1 (сообщение)). Но я не могу получить правильное значение подписи. Что-то не так?

Ответы на вопрос(2)

Решение Вопроса

Да, шифрование PKCS # 1 и подписи PKCS # 1разные, В случае шифрования (которое вы пробовали) входное сообщение просто дополняется до того, как оно будет возведено в степень.

С другой стороны, сигнатуры PKCS # 1 сначала рассчитывают структуру DER ASN.1 формы

DigestInfo ::= SEQUENCE {
    digestAlgorithm AlgorithmIdentifier,
    digest OCTET STRING
}

Затем он снова дополняется, чтобы сформировать закодированное сообщение EM

EM = 0x00 || 0x01 || PS || 0x00 || T

где PS - строка дополнения 0xff достаточной длины. Если вы воспроизводите этот EM и используетеRSA_private_encryptтогда вы получите правильную кодировку подписи PKCS # 1 v1.5, то же самое, что вы получитеRSA_sign или даже лучше, используя общийEVP_PKEY_sign.

Вот небольшая демонстрация в Ruby:

require 'openssl'
require 'pp'

data = "test"
digest = OpenSSL::Digest::SHA256.new
hash = digest.digest("test")
key = OpenSSL::PKey::RSA.generate 512

signed = key.sign(digest, data)
dec_signed = key.public_decrypt(signed)

p hash
pp OpenSSL::ASN1.decode dec_signed

Хеш SHA-256 распечатывается следующим образом:

"\x9F\x86\xD0\x81\x88L}e\x9A/..."

dec_signed является результатомRSA_sign снова расшифровывается с помощью открытого ключа - это возвращает нам точно входные данные для функции RSA с удаленным заполнением, и, как оказалось, это точноDigestInfo структура, упомянутая выше:

 #<OpenSSL::ASN1::Sequence:0x007f60dc36b250
 @infinite_length=false,
 @tag=16,
 @tag_class=:UNIVERSAL,
 @tagging=nil,
 @value=
  [#<OpenSSL::ASN1::Sequence:0x007f60dc36b318
    @infinite_length=false,
    @tag=16,
    @tag_class=:UNIVERSAL,
    @tagging=nil,
    @value=
     [#<OpenSSL::ASN1::ObjectId:0x007f60dc36b390
       @infinite_length=false,
       @tag=6,
       @tag_class=:UNIVERSAL,
       @tagging=nil,
       @value="SHA256">,
      #<OpenSSL::ASN1::Null:0x007f60dc36b340
       @infinite_length=false,
       @tag=5,
       @tag_class=:UNIVERSAL,
       @tagging=nil,
       @value=nil>]>,
   #<OpenSSL::ASN1::OctetString:0x007f60dc36b2a0
    @infinite_length=false,
    @tag=4,
    @tag_class=:UNIVERSAL,
    @tagging=nil,
    @value="\x9F\x86\xD0\x81\x88L}e\x9A/...">]>

Как вы можете видеть, значениеdigest полеDigestInfo это то же самое, что хеш SHA-256, который мы вычислили сами.

 iOS Padawan14 июн. 2012 г., 11:45
И что здесь делает RSA_PKCS1_PADDING?
 iOS Padawan14 июн. 2012 г., 11:37
Извините, еще один вопрос, как я могу получить EM с OpenSSL? Я проследил RSA_sign () и обнаружил, что i = RSA_private_encrypt (i, s, sigret, rsa, RSA_PKCS1_PADDING); что приводит к функции rsa_priv_enc, которую я не могу найти нигде. Спасибо
 iOS Padawan13 июн. 2012 г., 00:46
Спасибо за подробный ответ. Я получил правильную подпись, используя RSA_sign с NID_sha1 (NID_sha1WithRSA - неправильная), и я думаю, что могу получить закодированное значение, являющееся входом RSA_private_encrypt, изменив функцию RSA_sign OpenSSL. Еще раз большое спасибо!
 31 окт. 2016 г., 12:16
RSA_PKCS1_PADDING переключает SHAXС форматом подписи RSA в детерминированном и более совместимомPKCS1 формат (который ожидается по умолчанию, например, при проверке подписи из JAVA). Другой формат имеет некоторую случайность в заполнении - что делает каждую сигнатуру одних и тех же данных отличной - что делает его непригодным (например) дляfingerprinting полезной нагрузки сообщений Soap-XML.

вы, вероятно, должны использоватьrsa.hфункцияRSA_sign() а такжеRSA_verify(), которые были предназначены для использования наPKCS # 1подписи.

 24 июн. 2013 г., 10:19
может кто-нибудь помочь мне здесь, на моем постуstackoverflow.com/questions/17167254/… , Я хочу использовать шифрование privateKey с дополнением PKCS1 в iOS.
 iOS Padawan12 июн. 2012 г., 15:33
Я использовал RSA_sign (NID_SHA1, ...), но результат не тот, который был у меня с xmlsec (API подписи xml). Мне интересно, выполняет ли RSA_sign (NID_SHA1, ...) RSASSA-PKCS1-v1_5?
 12 июн. 2012 г., 09:27
Он также обрабатывает заполнение PKCS # 1 и кодирование ASN.1; если вы просто подписываете контент без дополнения, это может привести к недостаткам в RSA, и кодирование должно надежно взаимодействовать с другими программами.
 iOS Padawan12 июн. 2012 г., 04:28
Спасибо, что ответили. Я до сих пор не понимаю, что еще RSA_sign () ожидает от функций хеширования и шифрования RSA? Разве этих двух не достаточно?

Ваш ответ на вопрос