在 Python 3 中替代 M2Crypto 的 EVP

Alternative to M2Crypto's EVP in Python 3

我拼命尝试将一个旧项目升级到 Python3,但我 3 多年前编写的一个库使用了 M2Crypto,它在 Py3k 下似乎不可用。它几乎无法安装在 Python 2 上,但这完全是另一回事。

无论如何,我们只用它来用它的 EVP 模块对字符串进行签名。这是我们的 M2Crypto 使用范围:

from M2Crypto import EVP

def sign_string(message, priv_key_string):
    key = EVP.load_key_string(priv_key_string)
    key.reset_context(md='sha1')
    key.sign_init()
    key.sign_update(message)
    return key.sign_final()

从字符串加载密钥,使用 SHA1 并对提供的消息进行签名。表面上看起来真的很简单,但老实说我不知道​​发生了什么。 EVP 对我来说是个黑盒子。

在 Python 3 中还有其他可用的 EVP 库吗?或者有人知道让 M2Crypto 在 Python 3 中工作的秘诀吗?

好的,选择another project's migration away from M2crypto to rsa,除此之外,上面的内容可以很好地减少:

def sign_string(message, priv_key_string):
    import rsa
    key = rsa.PrivateKey.load_pkcs1(priv_key_string.encode())
    return rsa.sign(message.encode(), key, 'SHA-1')

这并不是说这就是所有需要做的事情。 Python3 的 bytes/string 分离搞砸了很多以前似乎不是问题的东西。我敢肯定这是有道理的,但是当您必须在成熟代码中逐步完成漫长的签名过程才能弄清楚您在说什么时,它就是一个 PITA。