python - Python:创建原始 ECC-ECDSA-SECP256R1 私有(32 字节)和公共(64 字节)密钥
问题描述
我想使用 Python 生成原始 32 字节私钥和原始 64 字节公钥(ECC-SECP256R1)。我应该在 Python 3.7 中安装哪个库以及调用哪些 API 才能生成原始密钥?请帮忙。TIA。
解决方案
ECDSA库可以做到这一点。
生成密钥对:
import ecdsa
sk = ecdsa.SigningKey.generate(curve=ecdsa.SECP256k1)
vk = sk.get_verifying_key()
# Your byte values will vary, each time you generate(). Here is an example pair.
skBytes = sk.to_string()
print(f"Signing key = {[b for b in skBytes]}")
# [242, 122, 66, 46, 189, 185, 103, 40, 162, 156, 155, 213, 77, 38, 251, 23, 148, 207, 49, 206, 122, 63, 117, 150, 196, 115, 82, 203, 95, 104, 60, 227]
vkBytes = vk.to_string()
print(f"Verifying key = {[b for b in vkBytes]}")
# [31, 164, 220, 214, 106, 22, 45, 112, 244, 49, 124, 250, 217, 209, 51, 83, 161, 239, 137, 124, 25, 220, 112, 116, 80, 9, 64, 130, 9, 27, 92, 198, 123, 146, 213, 154, 142, 148, 90, 6, 142, 177, 31, 151, 215, 9, 216, 36, 51, 27, 222, 224, 132, 7, 39, 227, 48, 31, 244, 218, 206, 59, 249, 196]
密钥对可以从字节中恢复:
skBytes = bytes([242, 122, 66, 46, 189, 185, 103, 40, 162, 156, 155, 213, 77, 38, 251, 23, 148, 207, 49, 206, 122, 63, 117, 150, 196, 115, 82, 203, 95, 104, 60, 227])
vkBytes = bytes([31, 164, 220, 214, 106, 22, 45, 112, 244, 49, 124, 250, 217, 209, 51, 83, 161, 239, 137, 124, 25, 220, 112, 116, 80, 9, 64, 130, 9, 27, 92, 198, 123, 146, 213, 154, 142, 148, 90, 6, 142, 177, 31, 151, 215, 9, 216, 36, 51, 27, 222, 224, 132, 7, 39, 227, 48, 31, 244, 218, 206, 59, 249, 196])
sk = ecdsa.SigningKey.from_string(skBytes, curve=ecdsa.SECP256k1)
vk = ecdsa.VerifyingKey.from_string(vkBytes, curve=ecdsa.SECP256k1)
# or vk = sk.get_verifying_key()
示例签名和验证:
message = b"Hello, world!"
signature = sk.sign(message)
print(f"{[b for b in signature]}")
# [161, 22, 110, 48, 232, 36, 152, 153, 22, 7, 177, 219, 157, 102, 237, 57, 243, 216, 186, 207, 22, 168, 170, 247, 216, 235, 160, 13, 35, 37, 141, 237, 63, 50, 84, 31, 203, 95, 212, 91, 13, 150, 156, 125, 255, 197, 30, 133, 193, 174, 129, 174, 192, 33, 90, 160, 243, 78, 96, 92, 38, 1, 237, 129]
isSignatureValid = vk.verify(signature, message)
print(f"{isSignatureValid=}")
# isSignatureValid=True
感谢这个问题向我介绍了 ecdsa 包: ECDSA Signing and Verifying issue between python ECDSA and C micro-ecc library
推荐阅读
- javascript - 自动删除 session-file-store 的 session 文件
- linux - 无法执行 docker 容器制作 OCI 运行时 exec 失败的错误:exec failed: container_linux.go:346: 启动容器进程导致
- .net - .NET CORE - ApplicationBuilder Map() 路径可以区分大小写
- powershell - Powershell Find-Module 找不到所有版本
- firefox - 如何从 Firefox 菜单中删除保护仪表板
- macos - nsurlsessiond - 占用所有带宽
- python - 图像侵蚀手动实现没有做任何事情 Python
- php - PHPSESSID Cookie 自动创建,无需调用 session_start()
- javascript - javascript; 将字符串转换为对象
- google-sheets - 两列单元格列表(下拉列表) - Google 表格