数字签名是一种加密机制,用于验证信息的完整性和来源的真实性。它通常涉及到两个主要过程:创建(签名)和验证。以下是数字签名的基本步骤:
生成密钥对:首先,需要一对公钥和私钥。私钥是保密的,而公钥可以公开分享。
准备待签名数据:将要签名的数据(如文件或消息)准备好。
计算哈希值:使用哈希算法(如SHA-256)对数据计算哈希值。哈希值是数据的摘要,任何微小的变化都会导致哈希值的巨大变化。
使用私钥加密哈希值:用私钥对上一步得到的哈希值进行加密,得到数字签名。
附加签名:将数字签名附加到原始数据或存储在一起,以便可以一起发送或存储。
接收数据和签名:获取原始数据和相应的数字签名。
计算接收数据的哈希值:使用相同的哈希算法对接收的数据重新计算哈希值。
使用公钥解密签名:使用发送者的公钥对数字签名进行解密,得到原始的哈希值。
比较哈希值:将解密得到的哈希值与新计算的哈希值进行比较。
验证结果:如果两个哈希值相同,则验证通过,表示数据未被篡改,并且来自声称的发送者。如果不同,则验证失败,数据可能被篡改或签名无效。
from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256
# 创建密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 待签名数据
data = b'Hello, World!'
# 计算数据的哈希值
hash_obj = SHA256.new(data)
# 使用私钥进行签名
signature = pkcs1_15.new(key).sign(hash_obj)
# 验证签名
try:
pkcs1_15.new(key.publickey()).verify(hash_obj, signature)
print("The signature is valid.")
except (ValueError, TypeError):
print("The signature is not valid.")