【问题标题】:meet M2Crypto.RSA.RSAError: bad signature while using rsa.verify遇到 M2Crypto.RSA.RSAError: bad signature while using rsa.verify
【发布时间】:2011-05-05 14:22:44
【问题描述】:

所有。我必须验证由 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

我不知道如何从从服务器获得的标志(即我的代码中的“标志”)生成良好的签名。 谢谢。

【问题讨论】:

    标签: php python rsa


    【解决方案1】:

    您如何在 PHP 中进行 RSA 签名?许多 PHP RSA 实现不执行符合 PKCS#1 的签名,这意味着它们不能互操作。

    我个人推荐phpseclib, a pure PHP RSA implementation

    【讨论】:

    • 感谢您的回答。也许我没有清楚地描述我的问题。我必须验证由 php 使用 python 生成的签名。我用的是django,不能用php来验证。
    • 也许我没有清楚地描述我的答案。如果您用来创建它的 PHP 库的签名不是 Django 支持的格式,那么 Django 显然无法验证它。我的建议是,问题不在于签名验证——而在于签名创建。您需要使用不同的 PHP RSA 库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多