如何用Python验证ECDSA/SHA2 S-MIME签名?

2 投票
3 回答
2089 浏览
提问于 2025-04-15 19:06

我们需要在两种签名方案中做选择:

  • 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单元测试,还有ecECDH单元测试ECDSA单元测试

撰写回答