【问题标题】:M2Crypto: verifying DSA signaturesM2Crypto:验证 DSA 签名
【发布时间】:2011-03-28 03:21:15
【问题描述】:

我在使用 Python/M2Crypto 验证 DSA 签名时遇到问题。签名是在 Java 中生成的,使用标准 java.security.Signature 类,带有 Sun 的加密提供程序和 SHA1withDSA 算法名称。

这是一些 shell 输出:

>>> pk
<M2Crypto.DSA.DSA_pub instance at 0x20b6a28>
>>> sig = '302c02141c4bbb218215ebfec57288059ce814dc430d849502144dd0c581bf2213aff79d17eb37c939e120a97bd2'.decode('hex')
>>> data ='0501...9794'.decode('hex')
>>> pk.verify_asn1(sig, data)
------------------------------------------------------------
Traceback (most recent call last):
    ...
DSAError: wrong tag

签名值对我来说似乎没问题,它看起来像是两个整数的正确 ASN.1 编码序列(0x302c 表示 44 字节序列,0x0214 表示 20 字节整数),这是 DSA 的标准编码签名。

由于甚至没有记录 DSA_pub.verify_asn1 方法,我也尝试使用记录在案的 DSA_pub.verify 方法,但仍然没有雪茄:

>>> r = sig[4:24]
>>> s = sig[26:]
>>> md = sha1(data).digest()
>>> pk.verify(md, r, s)
------------------------------------------------------------
Traceback (most recent call last):
    ...
DSAError: encoding error

文档声明所有参数都应该是“字节字符串”,但 verify 方法以某种方式设法引发编码错误。 我还尝试反转 r 和 s,以检查潜在的字节顺序问题,但这没有帮助。

我做错了什么?

【问题讨论】:

    标签: python digital-signature m2crypto dsa


    【解决方案1】:

    在测试中找到了解决方案:http://svn.osafoundation.org/m2crypto/trunk/tests/test_dsa.py

    verify_asn1 方法应该使用如下:

    >>> pk.verify_asn1(sha1(data).digest(), sig)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多