Я пытаюсь написать скрипт 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
Почему это происходит? Разве эта библиотека не является «официальной»? Какие у меня альтернативы? Можно ли просто удалить эту строку утверждения?
Вы должны спросить авторов программного обеспечения :) –
Попробуйте вставить один байт нуля ('0x00') в начало значений' r' и 's' (например, измените' 81AABB ... 'на' 0081AABB. ..'), чтобы убедиться, что число интерпретируется как положительное (Примечание: это _might_ будет сложным, поскольку вы должны изменить длину в кодированной сигнатуре - зависит от способа передачи значений 'r' и' s' для библиотека ecdsa). – vlp