如何在Python中使用P-256椭圆曲线实现ECDSA,以便验证签名?
解决方案
我一直在研究密码学,并使用椭圆曲线密码学来做数字签名。我一直在JavaCard上对数据进行签名,然后传输签名的数据、原始数据和W(曲线上的点)。
随后我用W 重构公钥并验证签名(受限于JavaCard的限制)。
到目前为止,我一直在Java中使用Bouncy Castle来完成这件事,但我在想在Python中是否有最佳实践的方法来实现这一点?
我做了一些谷歌搜索,找到了PyCryptodome https://pycryptodome.readthedocs.io/en/latest/index.html 和ecdsa https://ecdsa.readthedocs.io/en/latest/,但我很难找到能帮助我理解如何完成第二部分的示例——在不使用私钥的情况下重构公钥并验证签名。
你可以使用cryptography提供的原语 https://cryptography.io/en/latest/hazmat/primitives/#
你需要指定你想要的曲线:
curve = ec.SECP256R1()
然后用x 和y 重构公钥(从W 获取它们):
public_key = ec.EllipticCurvePublicNumbers(x, y, curve).public_key()
x和 y应该是整数
然后设置一个哈希函数:
hash: hashes.HashAlgorithm = hashes.SHA256()
然后用这个公钥和哈希来验证你的消息和签名:
try:
public_key.verify(signature, message, ec.ECDSA(hash))
except InvalidSignature:
print("Invalid")
你应该把你的代码放在try/except中,因为verify在无法验证时会抛出异常
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。