Как кодировать координаты x, y в формат python ecdsa, проверяющий ключ из Dart

#python #dart #cryptography #ecdsa

Вопрос:

Я пытаюсь отправить подтверждающий ключ из своего приложения flutter на сервер python и не могу определить формат, который ожидает библиотека python ecdsa.

Я использую библиотеку spec256k1 на стороне dart (на стороне python также используется кривая spec256k1).

 import ecdsa
sk = ecdsa.SigningKey.generate()
vk = sk.get_verifying_key()
s_vk = vk.to_string()

# I can't figure out how to create the 's_vk' from x, y croods

string_sent_from_app = "..." # how to create this string on the app side from x, y or you have a better idea?
my_vk = ecdsa.VerifyingKey.from_string(string_sent_from_app)


 

Ответ №1:

from_string() позволяет импортировать открытый ключ в различных форматах, включая необработанный ключ, который подходит именно вам.
Формат raw состоит из объединения координат x и y точки EC. Для secp256k1 x и y равны 32 байтам каждый, то есть всего 64 байта. Если x короче, он должен быть дополнен слева значениями 0x00 до 32 байт (аналогично для y).

Пример импорта необработанного открытого ключа EC:

 import ecdsa
from hashlib import sha256

rawPublicKey = 'ba11d6acfd759a7a75c662db85015373bf99972f42910391ac0f4e0e6bfdc72e0b282f324b448c637e54e6d0f1f51576f150c559f38b32f2ea7a3d9aaf5c1694'
signature = '1fe21a18c6e51000e76f7b69ffcb71471067775803d650392ff036cebe314098c6cacf0818e2d646f53699e97efbadd0b6dea9bca5a09cd5b76f42a75004a798'
message = b'The quick brown fox jumps over the lazy dog'

verifyingKey = ecdsa.VerifyingKey.from_string(bytes.fromhex(rawPublicKey), curve=ecdsa.SECP256k1, hashfunc=sha256, valid_encodings=['raw'])
verified = verifyingKey.verify(bytes.fromhex(signature), message)
print(verified) # True
 

Обратите внимание, что кривая и дайджест должны быть явно указаны, так как библиотека ecdsa использует разные значения по умолчанию (NIST P-192 , обозначается как NIST192p , и SHA-1).


В целом, библиотека поддерживает большое количество форматов для импорта, например, сжатый и несжатый формат (via from_string() ), а также формат X. 509/SPKI (via from_pem() и from_der() для ключей с кодировкой PEM и DER соответственно).
Более подробную информацию можно найти в документации, см. раздел Использование и реализация, особенно в keys.py.