如何从 Dart 将 x、y 坐标编码为 python ecdsa VerifyingKey 格式

Posted

技术标签:

【中文标题】如何从 Dart 将 x、y 坐标编码为 python ecdsa VerifyingKey 格式【英文标题】:How to encode x, y coords to python ecdsa VerifyingKey format from Dart 【发布时间】:2021-09-06 15:11:18 【问题描述】:

我正在尝试将验证密钥从我的颤振应用程序发送到 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】:

from_string() 允许导入不同格式的公钥,包括适合您的 raw 密钥。 原始格式包括连接 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 编码的密钥)。 更多信息可以在文档中找到,请参阅第 sec。 Usage,以及实现,尤其是在keys.py

【讨论】:

以上是关于如何从 Dart 将 x、y 坐标编码为 python ecdsa VerifyingKey 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 将 Bing 地图四键转换为缩放级别、x 坐标和 y 坐标?

如何将x,y坐标转换为角度?

将游戏的 x,y 坐标转换为 Google 地球纬度/经度

南方cass 中 用原图生成无编码高程点的时候,x,y坐标与原图不符,高程值是对的,如何解决这个问题

从纬度,经度转换为x,y

将表示旋转的四元数从一个坐标系转换为另一个坐标系