使用 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
应该可行。目前似乎没有理由使用它 。