2

Python/M2Crypto を使用して DSA 署名を検証できません。署名は、標準の java.security.Signature クラスを使用して Java で生成され、Sun の暗号化プロバイダと SHA1withDSA アルゴリズムが指定されています。

シェル出力は次のとおりです。

>>> 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 でエンコードされた 2 つの整数のシーケンスのように見えます (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 を逆にしてみましたが、それは役に立ちませんでした。

私は何を間違っていますか?

4

1 に答える 1

4

テストで解決策が見つかりました:http ://svn.osafoundation.org/m2crypto/trunk/tests/test_dsa.py

verify_asn1メソッドは次のように使用する必要があります。

>>> pk.verify_asn1(sha1(data).digest(), sig)
于 2010-08-12T00:53:00.753 に答える