如何将 x、y 坐标编码为来自 Dart 的 python ecdsa VerifyingKey 格式
How to encode x, y coords to python ecdsa VerifyingKey format from Dart
我正在尝试将验证密钥从我的 flutter 应用程序发送到 python 服务器,但我无法弄清楚 python ecdsa lib 期望的格式。
我在 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)
from_string()
允许导入不同格式的 public 密钥,包括适合您的 raw 密钥。
原始格式包括连接 EC 点的 x 和 y 坐标。对于 secp256k1,x 和 y 各为 32 字节,因此总共 64 字节。如果 x 更短,则必须从左侧用 0x00 值填充到 32 字节(与 y 类似)。
导入原始 public 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, and the implementation, especially in keys.py.
我正在尝试将验证密钥从我的 flutter 应用程序发送到 python 服务器,但我无法弄清楚 python ecdsa lib 期望的格式。
我在 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)
from_string()
允许导入不同格式的 public 密钥,包括适合您的 raw 密钥。
原始格式包括连接 EC 点的 x 和 y 坐标。对于 secp256k1,x 和 y 各为 32 字节,因此总共 64 字节。如果 x 更短,则必须从左侧用 0x00 值填充到 32 字节(与 y 类似)。
导入原始 public 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, and the implementation, especially in keys.py.