5

これら 2 つのコードは同じ署名を提供します。

コード 1:

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)

コード 2:

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

説明をお願いできますか?後者の署名方法の何が問題になっていますか?

4

2 に答える 2

3

違いはRSA_sign、ダイジェスト PKCS1 algorithmIdentifier をダイジェスト データと共に署名し、ダイジェストRSA_private_encryptデータのみに署名することだと思います。

RSA_private_encryptのman ページから:

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.
于 2011-04-16T03:41:42.587 に答える
1

で内部的に起こること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')

詳細な説明についてはこの回答を、完全な例についてはこの要点を参照してください。

しかし、肝心なのは、上記のコード 1EVP.sign()のように代わりに使用する必要があるということです。これは内部的に正しいことを行います。

于 2015-01-10T19:30:34.857 に答える