使用 pycrypto 生成 RSA 签名

RSA 可用于创建消息签名。只有通过访问私有 RSA 密钥才能生成有效签名,另一方面,仅使用相应的公钥就可以进行验证。因此,只要对方知道你的公钥,他们就可以验证你要签名的消息并保持不变 - 例如,用于电子邮件的方法。目前,此功能需要第三方模块,如 pycrypto

import errno

from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5

message = b'This message is from me, I promise.'

try:
    with open('privkey.pem', 'r') as f:
        key = RSA.importKey(f.read())
except IOError as e:
    if e.errno != errno.ENOENT:
        raise
    # No private key, generate a new one. This can take a few seconds.
    key = RSA.generate(4096)
    with open('privkey.pem', 'wb') as f:
        f.write(key.exportKey('PEM'))
    with open('pubkey.pem', 'wb') as f:
        f.write(key.publickey().exportKey('PEM'))

hasher = SHA256.new(message)
signer = PKCS1_v1_5.new(key)
signature = signer.sign(hasher)

验证签名的工作方式类似但使用公钥而不是私钥:

with open('pubkey.pem', 'rb') as f:
    key = RSA.importKey(f.read())
hasher = SHA256.new(message)
verifier = PKCS1_v1_5.new(key)
if verifier.verify(hasher, signature):
    print('Nice, the signature is valid!')
else:
    print('No, the message was signed with the wrong private key or modified')

注意 :以上示例使用 PKCS#1 v1.5 签名算法,这是非常常见的。pycrypto 还实现了较新的 PKCS#1 PSS 算法,如果你想使用那个,那么在示例中用 PKCS1_PSS 替换 PKCS1_v1_5 应该可行。目前似乎没有理由使用它