M2Crypto: проверка подписей DSA - PullRequest
       39

M2Crypto: проверка подписей DSA

2 голосов
/ 11 августа 2010

У меня проблемы с проверкой подписей DSA с использованием Python / M2Crypto. Сигнатуры генерируются в Java с использованием стандартного класса java.security.Signature с криптографическим поставщиком 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 из двух целых чисел (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, чтобы проверить потенциальные проблемы с порядком байтов, но это не помогло.

Что я делаю не так?

1 Ответ

4 голосов
/ 12 августа 2010

Нашел решение в тестах: http://svn.osafoundation.org/m2crypto/trunk/tests/test_dsa.py

Метод verify_asn1 следует использовать следующим образом:

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