M2crypto签名“算法”

这两个代码提供相同的签名,这是预期的: 代码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
您能提供一些解释吗?后一种签名方式有什么问题?     
已邀请:
我相信不同之处在于,“ 3”与摘要数据一起签名摘要PKCS1 algorithmIdentifier,而“ 4”仅对摘要数据签名。 在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.
    
EVP.sign()
内部发生的情况如下(与普通plain7ѭ相反):
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\')
有关更多说明,请参见此答案;有关完整示例,请参见本要点。 但最重要的是,应该像上面的代码1一样使用
EVP.sign()
-内部执行正确的操作。     

要回复问题请先登录注册