在Python中使用Cryptodome.PublicKey.RSA进行数字签名验证
发布时间:2024-01-20 12:00:35
在Python中,可以使用Cryptodome库中的PublicKey模块的RSA类来进行数字签名验证。RSA算法是一种非对称加密算法,其基本原理是利用一对密钥(公钥和私钥)进行加密和解密。
以下是一个使用Cryptodome.PublicKey.RSA进行数字签名验证的例子:
首先,需要安装Cryptodome库。可以使用以下命令来安装:
pip install pycryptodome
接下来,我们可以编写一个函数来生成RSA公钥和私钥,并将其保存到文件中。示例代码如下:
from Cryptodome.PublicKey import RSA
def generate_key_pair():
# 生成RSA密钥对
key_pair = RSA.generate(2048)
# 保存公钥到文件
with open('public_key.pem', 'wb') as f:
f.write(key_pair.publickey().export_key())
# 保存私钥到文件
with open('private_key.pem', 'wb') as f:
f.write(key_pair.export_key())
# 调用函数生成RSA密钥对
generate_key_pair()
上述代码会在当前目录下生成public_key.pem和private_key.pem两个文件,分别保存了RSA公钥和私钥。
接下来,我们可以编写一个函数来进行数字签名和验证。示例代码如下:
from Cryptodome.Signature import pkcs1_15
from Cryptodome.Hash import SHA256
def sign_message(private_key_path, message):
# 从文件中加载私钥
with open(private_key_path, 'rb') as f:
private_key = RSA.import_key(f.read())
# 计算消息的哈希值
hash_value = SHA256.new(message.encode())
# 使用私钥进行数字签名
signature = pkcs1_15.new(private_key).sign(hash_value)
return signature
def verify_signature(public_key_path, message, signature):
# 从文件中加载公钥
with open(public_key_path, 'rb') as f:
public_key = RSA.import_key(f.read())
# 计算消息的哈希值
hash_value = SHA256.new(message.encode())
try:
# 使用公钥验证数字签名
pkcs1_15.new(public_key).verify(hash_value, signature)
print("Signature is valid.")
return True
except (ValueError, TypeError):
print("Signature is invalid.")
return False
# 生成数字签名
signature = sign_message('private_key.pem', 'Hello, world!')
# 验证数字签名
verify_signature('public_key.pem', 'Hello, world!', signature)
上述代码中,我们使用私钥对消息进行数字签名,并将签名结果保存到signature变量中。然后,我们使用公钥来验证签名的有效性。如果签名有效,会输出"Signature is valid.";如果签名无效,会输出"Signature is invalid."。
需要注意的是,在实际应用中,需要保护好私钥的安全性,确保只有授权的人能够使用私钥进行数字签名。
