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