首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >M2crypto签名“算法”

M2crypto签名“算法”
EN

Stack Overflow用户
提问于 2011-04-14 12:16:32
回答 2查看 3.1K关注 0票数 5

这两个代码提供了相同的签名,预计:

code1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
pkey = RSA.load_key("mykey.pem")
signature = pkey.sign(hashlib.sha1(text).digest())
print base64.b64encode(signature)

但是,如果我想“模仿”签名算法,即用私钥加密摘要,我会得到一个不同的签名,即:

代码语言:javascript
复制
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

请你解释一下好吗?后一种签署方式有什么问题?

EN

回答 2

Stack Overflow用户

发布于 2011-04-16 03:41:42

我认为不同之处在于,RSA_sign与摘要数据一起签署摘要PKCS1 algorithmIdentifier,其中RSA_private_encrypt只对摘要数据签名。

来自RSA手册页:

代码语言:javascript
复制
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.
票数 3
EN

Stack Overflow用户

发布于 2015-01-10 19:30:34

EVP.sign()中内部发生的事情如下(与普通的RSA.sign()不同):

代码语言:javascript
复制
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() --它在内部做的是正确的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5663084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档