2016-01-10 3 views
0

Я пытаюсь написать скрипт python, который проверяет подпись ECDSA, и я испытываю страшное время, пытаясь это сделать.Почему Python ECDSA не поддерживает отрицательные числа?

Это код, я использую:

public_key = ecdsa.VerifyingKey.from_string(pubkey, curve=ecdsa.SECP256k1) 
verified = public_key.verify_digest(signature, val, sigdecode=ecdsa.util.sigdecode_der) 

Если подпись г и s положительны, она работает хорошо, но если один из них является отрицательным, то ошибка утверждение поднимает. Я проверил ECDSA исходников, и я увидел эту строку:

nbytes = numberbytes[0] if isinstance(numberbytes[0], integer_types) else ord(numberbytes[0]) 
assert nbytes < 0x80 # can't support negative numbers yet 

https://github.com/warner/python-ecdsa/blob/master/ecdsa/der.py#L105

Почему это происходит? Разве эта библиотека не является «официальной»? Какие у меня альтернативы? Можно ли просто удалить эту строку утверждения?

+0

Вы должны спросить авторов программного обеспечения :) –

+1

Попробуйте вставить один байт нуля ('0x00') в начало значений' r' и 's' (например, измените' 81AABB ... 'на' 0081AABB. ..'), чтобы убедиться, что число интерпретируется как положительное (Примечание: это _might_ будет сложным, поскольку вы должны изменить длину в кодированной сигнатуре - зависит от способа передачи значений 'r' и' s' для библиотека ecdsa). – vlp

ответ

2

ECDSA сам по себе не использует отрицательные числа, поэтому я не ожидал, что его реализация на Python будет поддерживать отрицательные числа. Типы чисел, используемые ECDSA, находятся между 0 и некоторым большим простым числом, и они подчиняются законам модульной арифметики.

+0

Тогда почему мой openssl возвращает отрицательные числа s или r в конце концов? – Jorky10

+1

@ Jorky10 - Это зависит от стандарта. Если они закодированы как ASN.1 *** 'INTEGER' ***, то они никогда не будут отрицательными, потому что будет ведущий октет 00. Если они являются ASN.1 *** 'OCTET_STRING' *** или байтовой строкой (т. Е. 40 байтов для пары ***' {r, s} '*** при использовании SHA1, 64 байта для ** * '{r, s}' *** пара при использовании SHA256 и т. д.), то у Python есть ошибка в его парсере или подпрограмме. – jww

+0

Я думаю, что есть трюк. Спасибо, что дал мне путь к следующему! – Jorky10

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