如何将Dart中的x、y坐标编码为Python ecdsa VerifyingKey格式

3

我正在尝试从我的Flutter应用程序将验证密钥发送到Python服务器,但我无法弄清楚Python的ecdsa库期望的格式。

我在Dart端使用的是spec256k1库(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个回答

3

from_string()函数允许以不同的格式导入公钥,包括原始格式,适合您使用。
原始格式由EC点的x和y坐标连接而成。对于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),因此必须明确指定曲线和摘要算法。
总体而言,该库支持大量导入格式,例如压缩未压缩格式(通过from_string()),以及X.509/SPKI格式(通过from_pem()from_der()分别用于PEM和DER编码密钥)。更多信息可以在文档中找到,参见第Usage部分和实现,特别是在keys.py中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接