使用 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
應該可行。目前似乎沒有理由使用它 。