如何用Python验证ECDSA/SHA2 S-MIME签名?
我们需要在两种签名方案中做选择:
- RSA/SHA2 S-MIME 签名
- ECDSA/SHA2 S-MIME 签名
为了这个选择,我们的 Python 软件需要支持其中一种方案。目前由于一些政治原因,ECDSA 方案更受欢迎。
请问 Python 的加密模块(比如 M2Crypto 等)是否支持 ECDSA 方案?有没有相关的示例可以参考?
看起来 ECDSA 的支持在 openssl 中也还很年轻。
提前感谢!
3 个回答
0
你可以试试用 Python 的 ecdsa 包,适用于 Python3:
pip3 install ecdsa
用法:
from ecdsa import SigningKey
sk = SigningKey.generate() # uses NIST192p
vk = sk.get_verifying_key()
sig = sk.sign(b"message")
vk.verify(sig, b"message") # True
如果你想用公钥来验证一个已经存在的签名,可以这样做:
from ecdsa import VerifyingKey
message = b"message"
public_key = '7bc9c7867cffb07d3443754ecd3d0beb6c4a2f5b0a06ea96542a1601b87892371485fda33fe28ed1c1669828a4bb2514'
sig = '8eb2c6bcd5baf7121facfe6b733a7835d01cef3d430a05a4bcc6c5fbae37d64fb7a6f815bb96ea4f7ed8ea0ab7fd5bc9'
vk = VerifyingKey.from_string(bytes.fromhex(public_key))
vk.verify(bytes.fromhex(sig), message) # True
这个包也兼容 Python 2。
0
椭圆曲线密码学(ECDSA)和更常见的RSA都可以在OpenSSL库中使用。我建议使用pyOpenSSL这个工具来帮助你。
1
ECDSA(椭圆曲线数字签名算法)在M2Crypto中是支持的,但可以选择关闭。例如,基于Fedora的系统在OpenSSL和M2Crypto中默认是关闭ECDSA的。M2Crypto还提供了一些SMIME支持,不过我自己用得不多,所以不太确定这在这种情况下是否有帮助。你可以查看M2Crypto的SMIME文档和SMIME单元测试,还有ec、ECDH单元测试和ECDSA单元测试。