欢迎访问宙启技术站
智能推送

在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."。

需要注意的是,在实际应用中,需要保护好私钥的安全性,确保只有授权的人能够使用私钥进行数字签名。