M2crypto подпись "алгоритм" - PullRequest
       54

M2crypto подпись "алгоритм"

4 голосов
/ 14 апреля 2011

Эти два кода обеспечивают одну и ту же подпись, что и ожидается:

code1:

from M2Crypto import RSA, EVP
import base64, hashlib

text = "some text"

pkey = EVP.load_key("mykey.pem")  #"mykey.pem" was generated as: openssl genrsa -des3 -out mykey.pem 2048
pkey.sign_init()
pkey.sign_update(text)
signature = pkey.sign_final()
print base64.b64encode(signature)

code2:

pkey = RSA.load_key("mykey.pem")
signature = pkey.sign(hashlib.sha1(text).digest())
print base64.b64encode(signature)

Однако, если я хочу "подражая «алгоритму подписи», то есть шифруя дайджест с помощью закрытого ключа, я получаю другую подпись, а именно:

pkey = RSA.load_key("mykey.pem")
signature = pkey.private_encrypt(hashlib.sha1(text).digest(), RSA.pkcs1_padding)
print base64.b64encode(signature)  #different from the two above

Не могли бы вы дать какое-то объяснение?Что не так с последним способом подписания?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Я полагаю, что разница в том, что RSA_sign подписывает дайджест PKCS1gorithIdentifier вместе с данными дайджеста, где RSA_private_encrypt подписывает только данные дайджеста.

Из справочной страницы RSA_private_encrypt :

RSA_PKCS1_PADDING
    PKCS #1 v1.5 padding. This function does not handle the
    algorithmIdentifier specified in PKCS #1. When generating or
    verifying PKCS #1 signatures, RSA_sign(3) and RSA_verify(3) should
    be used.
0 голосов
/ 10 января 2015

Внутри EVP.sign() происходит следующее (в отличие от простого RSA.sign()):

sha1_hash = hashlib.sha1(MESSAGE).digest()
# Add ASN.1 SHA-1 OID prefix
sha1_asn1_prefix = '3021300906052b0e03021a05000414'.decode('hex')
asn1_hash = sha1_asn1_prefix + sha1_hash
rsa = RSA.load_key(KEY)
# Use PKCS#1 padding
signature = rsa.private_encrypt(asn1_hash, RSA.pkcs1_padding).encode('hex')

См. этот ответ для более подробного объяснения и эту суть. для полного примера.

Но суть в том, что вместо этого следует использовать EVP.sign(), как в коде 1 выше - он делает все правильно внутри.

...