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

Python中利用Crypto.PublicKey.RSA实现RSA数字签名

发布时间:2023-12-17 16:47:51

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,其中的私钥可以用于对数据进行数字签名。Python中,可以使用Crypto.PublicKey.RSA包来实现RSA数字签名。

下面是一个使用RSA数字签名的例子:

from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256

# 生成RSA密钥对
key = RSA.generate(2048)

# 获取私钥和公钥
private_key = key.export_key()
public_key = key.publickey().export_key()

# 保存密钥文件
with open('private.pem', 'wb') as f:
    f.write(private_key)
with open('public.pem', 'wb') as f:
    f.write(public_key)

# 加载私钥和公钥
private_key = RSA.import_key(open('private.pem').read())
public_key = RSA.import_key(open('public.pem').read())

# 待签名的数据
data = b'This is a test message.'

# 计算Hash值
hash = SHA256.new(data)

# 使用私钥进行签名
signature = pkcs1_15.new(private_key).sign(hash)

# 使用公钥进行验证签名
try:
    pkcs1_15.new(public_key).verify(hash, signature)
    print("Signature is valid.")
except (ValueError, TypeError):
    print("Signature is invalid.")

在这个例子中,首先使用RSA.generate(2048)生成一个2048位的RSA密钥对,并将私钥和公钥保存到文件中。然后加载私钥和公钥,并定义待签名的数据。接下来,使用SHA256.new(data)计算待签名数据的Hash值。最后,使用私钥对Hash值进行签名,并使用公钥验证签名的有效性。

在实际应用中,可以将私钥保存在服务端,用于生成签名,而公钥可以分发给客户端进行签名验证。这样可以确保数据的完整性和真实性。