用python-ecdsa验证OpenSSL生成的私钥公钥

之前的文章中,我们学习了用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)

相关链接

H2
H3
H4
3 columns
2 columns
1 column
10 Comments