这是一个易于使用的 ECC(椭圆曲线密码学)实现,支持 ECDSA(椭圆曲线数字签名算法)、EdDSA(爱德华曲线数字签名算法)和 ECDH(椭圆曲线 Diffie-Hellman),完全用纯 Python 实现,并以 MIT 许可证发布。使用此库,您可以快速创建密钥对(签名密钥和验证密钥)、对消息签名并验证签名。您还可以基于交换的公钥协商出共享密钥。密钥和签名都非常短,易于处理并集成到其他协议中。
注意:此库不应在生产环境中使用,详情请参阅 Security。
此库为五种流行的 NIST“Suite B”GF(p)(素数域)曲线提供密钥生成、签名、验证和共享密钥派生功能,密钥长度分别为 192、224、256、384 和 521 位。这些曲线在 OpenSSL 工具(openssl ecparam -list_curves)中的“短名称”为:prime192v1、secp224r1、prime256v1、secp384r1 和 secp521r1。它还包含 Bitcoin 所使用的 256 位曲线 secp256k1。此外还支持 Brainpool 曲线从 160 到 512 位的常规(非扭曲)变体。这些曲线的“短名称”为:brainpoolP160r1、brainpoolP192r1、brainpoolP224r1、brainpoolP256r1、brainpoolP320r1、brainpoolP384r1、brainpoolP512r1。SEC 标准中的少量小曲线也被包含在内(主要用于加速库的测试),它们是:secp112r1、secp112r2、secp128r1 和 secp160r1。同时支持 Ed25519 和 Ed448 曲线的密钥生成、签名和验证。库中未包含其他曲线,但要添加对更多素数域曲线的支持并不困难。
此库仅使用 Python 和 'six' 包。它兼容 Python 2.6、2.7 和 3.6+。它还支持在 pypy 和 pypy3 等替代实现上运行。
如果安装了 gmpy2 或 gmpy,它们将被用于加速算术运算。它们中的任何一个都可以在本库安装后安装,python-ecdsa 会在启动时检测到它们的存在并自动使用。在 Python3 上,为了获得最佳性能,您应该优先选择 gmpy2。
要运行 OpenSSL 兼容性测试,'openssl' 工具必须位于您的 PATH 中。此版本已成功针对 OpenSSL 0.9.8o、1.0.0a、1.0.2f、1.1.1d 和 3.0.1(以及其他版本)进行了测试。
此库可在 PyPI 上获取,建议使用 pip 安装:```
pip install ecdsa
如果需要更高的性能,并且使用原生代码没有问题,可以指定与 `gmpy2` 一起安装:```
pip install ecdsa[gmpy2]
或(较慢的旧版选项):``` pip install ecdsa[gmpy]
## 速度
下表展示了此库生成密钥对(`keygen`)、签名数据(`sign`)、验证这些签名(`verify`)、派生共享密钥(`ecdh`)以及在没有密钥特定预计算的情况下验证签名(`no PC verify`)所需的时间。
所有这些值均以秒为单位。
为方便起见,还提供了这些值的倒数:
每秒可生成的密钥数量(`keygen/s`)、每秒可生成的签名数量(`sign/s`)、每秒可验证的签名数量(`verify/s`)、每秒可派生的共享密钥数量(`ecdh/s`),以及每秒可在没有密钥特定预计算的情况下验证的签名数量(`no PC verify/s`)。原始签名的大小(通常是签名可编码的最小方式)也由 `siglen` 列提供。
使用 `tox -e speed` 可在您自己的计算机上生成此表。
在 Intel Core i7 4790K @ 4.0GHz 上,我获得了以下性能:```
siglen keygen keygen/s sign sign/s verify verify/s no PC verify no PC verify/s
NIST192p: 48 0.00032s 3134.06 0.00033s 2985.53 0.00063s 1598.36 0.00129s 774.43
NIST224p: 56 0.00040s 2469.24 0.00042s 2367.88 0.00081s 1233.41 0.00170s 586.66
NIST256p: 64 0.00051s 1952.73 0.00054s 1867.80 0.00098s 1021.86 0.00212s 471.27
NIST384p: 96 0.00107s 935.92 0.00111s 904.23 0.00203s 491.77 0.00446s 224.00
NIST521p: 132 0.00210s 475.52 0.00215s 464.16 0.00398s 251.28 0.00874s 114.39
SECP256k1: 64 0.00052s 1921.54 0.00054s 1847.49 0.00105s 948.68 0.00210s 477.01
BRAINPOOLP160r1: 40 0.00025s 4003.88 0.00026s 3845.12 0.00053s 1893.93 0.00105s 949.92
BRAINPOOLP192r1: 48 0.00033s 3043.97 0.00034s 2975.98 0.00063s 1581.50 0.00135s 742.29
BRAINPOOLP224r1: 56 0.00041s 2436.44 0.00043s 2315.51 0.00078s 1278.49 0.00180s 556.16
BRAINPOOLP256r1: 64 0.00053s 1892.49 0.00054s 1846.24 0.00114s 875.64 0.00229s 437.25
BRAINPOOLP320r1: 80 0.00073s 1361.26 0.00076s 1309.25 0.00143s 699.29 0.00322s 310.49
BRAINPOOLP384r1: 96 0.00107s 931.29 0.00111s 901.80 0.00230s 434.19 0.00476s 210.20
BRAINPOOLP512r1: 128 0.00207s 483.41 0.00212s 471.42 0.00425s 235.43 0.00912s 109.61
SECP112r1: 28 0.00015s 6672.53 0.00016s 6440.34 0.00031s 3265.41 0.00056s 1774.20
SECP112r2: 28 0.00015s 6697.11 0.00015s 6479.98 0.00028s 3524.72 0.00058s 1716.16
SECP128r1: 32 0.00018s 5497.65 0.00019s 5272.89 0.00036s 2747.39 0.00072s 1396.16
SECP160r1: 42 0.00025s 3949.32 0.00026s 3894.45 0.00046s 2153.85 0.00102s 985.07
Ed25519: 64 0.00076s 1324.48 0.00042s 2405.01 0.00109s 918.05 0.00344s 290.50
Ed448: 114 0.00176s 569.53 0.00115s 870.94 0.00282s 355.04 0.01024s 97.69