遇到M2Crypto.RSA.RSAError: 使用rsa.verify时签名错误

0 投票
1 回答
1304 浏览
提问于 2025-04-16 17:03

大家好。我需要验证一个用PHP生成的签名,但我现在用的是Python。

这是我的代码:

e, n = parse_key('publickey(prod).xml')
rsakey = Crypto.PublicKey.RSA.construct((long(n), long(e)))
public_key = rsakey.publickey().exportKey()
bio = M2Crypto.BIO.MemoryBuffer(public_key)
rsa = M2Crypto.RSA.load_pub_key_bio(bio)

sign = 'E04bby1CgTm4EvTSp3ZXsgb/P/x7YQX90+Rb5sTZe7XItVR5y5ZtQZyVUszNaUS2fiOrepcLrMnAjTSs9mHa7WCpCNvM5baKSARsm2Jgt6orwzYqAKKBxhP3GhV1aMqNV5swpdJmuH4J70qvcE1iCs0ji9rCBmG3ZwPjGukfUoQ='
unsigned_data = 'merchantId=109060001104024&version=v1.0&language=1&signType=1&issuerId=&paymentOrderId=20110503115316732&orderNo=109060001104024201105031155191155199245&orderDatetime=20110503115519&orderAmount=1&payDatetime=20110503115316&payAmount=1&ext1=&ext2=&payResult=1&errorCode=&returnDatetime=20110503115418'    
m = EVP.MessageDigest('sha1')
print m.update(unsigned_data)
digest = m.final()
sign = base64.b64decode(sign)
result = rsa.verify(digest, sign, algo='sha1')

这是我遇到的错误信息:

Traceback (most recent call last):
  File "E:\project\site\daybang\allinpay\pub_xml.py", line 38, in <module>
    result = rsa.verify(digest, sign, algo='sha1')
  File "C:\Python25\Lib\site-packages\M2Crypto\RSA.py", line 205, in verify
    return m2.rsa_verify(self.rsa, data, signature, digest_type) 
M2Crypto.RSA.RSAError: bad signature

我不知道如何从服务器获取的签名(也就是我代码里的“sign”)生成正确的签名。谢谢。

1 个回答

0

你在PHP中是怎么做RSA签名的?很多PHP的RSA实现并不符合PKCS#1标准,这就意味着它们之间不能互相兼容。

我个人推荐使用phpseclib,这是一个纯PHP的RSA实现

撰写回答