在之前的文章中,我们学习了用OpenSSL命令行生成Elliptic Curve (EC) algorithms(椭圆曲线算法)私钥、公钥。在文末我们提出计划,将尝试ecdsa来操作OpenSSL生成的公私钥,来验证一下他们生成出来的东西是否本质上是一样的。
这一节我们将着手进行尝试,来解除心里的疑问。
(图源 :pixabay)
思路
我们知道OpenSSL可以生成公钥私钥,python-ecdsa 同样可以。那么如果用OpenSSL生成公钥公钥对,用python-ecdsa使用OpenSSL生成的私钥来生成公钥,再去与OpenSSL生成的公钥对比,如果二者相同,那么说明他们从相同的私钥生成的公钥完全一致。也就是说本质上是一样的。
其实还可以反过来用python-ecdsa生成公私钥对,然后用OpenSSL用ecdsa生成的私钥来生成公钥再对比,结果应该没什么不同,感兴趣的朋友可以自己试试。
方法
为了便于实现,我将上述思路简化为如下方法:
- OpenSSL生成公私钥
- python-ecdsa读入私钥生成SigningKey
- python-ecdsa使用SigningKey生成VerifyingKey_1
- 显示VerifyingKey_1的字符串形式
- python-ecdsa读入公钥生成VerifyingKey_2
- 显示VerifyingKey_2的字符串形式
- 比较VerifyingKey_1和VerifyingKey_2的字符串形式异同
步骤如下
用OpenSSL生成私钥
openssl ecparam -name secp256k1 -genkey -out secp256k1-key.pem
用OpenSSL使用上述私钥生成公钥
openssl ec -in secp256k1-key.pem -pubout -out ecpubkey.pem
使用python-ecdsa读入OpenSSL生成的私钥生成SigningKey
sk = ecdsa.SigningKey.from_pem(open('secp256k1-key.pem').read())
使用SigningKey生成VerifyingKey1
vk1 = sk.get_verifying_key()
显示vk1字符串形式
print(hexlify(vk1.to_string()).decode())
7b640807271f75d09be794b54f1b3df5d1830cd3a2238325816ddc4dfd9eff2187794e70efd716fa5b2b13abc60cbdc2fdcda7f7779bf2fd7945d9d6936e0925
python-ecdsa读入公钥生成VerifyingKey_2
vk2 = ecdsa.VerifyingKey.from_pem(open('ecpubkey.pem').read())
显示vk2字符串形式
print(hexlify(vk2.to_string()).decode())
7b640807271f75d09be794b54f1b3df5d1830cd3a2238325816ddc4dfd9eff2187794e70efd716fa5b2b13abc60cbdc2fdcda7f7779bf2fd7945d9d6936e0925
- 当然了,我们也可以直接用以下代码来确认
assert vk.to_string()==vk2.to_string()
结论
通过上述测试,我们可知OpenSSL生成的私钥公钥和python-ecdsa生成,没有什么本质的区别(至少私钥到公钥部分是这样的)。
而我们之前的文章也介绍过,使用secp256k1-py也可以生成公私钥。也就是说无论是OpenSSL还是secp256k1-py又或是python-ecdsa都可以用于生成私钥公钥,当然了,其实也都可以用于签名和校验。
也就是说,无论是刀还是剑还是其它十八般兵器中的一种,都可以用来战斗,具体选择哪个,取决于你擅长那个喽。
(图源 :pixabay)