2010-08-11 4 views
2

У меня возникли проблемы с проверкой подписи DSA с использованием Python/M2Crypto. Подписи генерируются в Java, используя стандартный класс java.security.Signature, с криптовым провайдером Sun и обозначением алгоритма SHA1withDSA.M2Crypto: проверка подписи DSA

Вот некоторые выходной оболочки:

>>> 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 

Документов состояние, что все параметры должны быть «байты strings ", но метод проверки каким-то образом способен поднять ошибку кодирования. Я также попытался обратить вспять r и s, чтобы проверить потенциальные проблемы с контентом, но это не помогло.

Что я делаю неправильно?

ответ

Смежные вопросы