如何使用Python中的load_pem_public_key()函数验证数字签名
发布时间:2024-01-05 04:44:40
在Python中,可以使用load_pem_public_key()函数来验证数字签名。该函数位于cryptography.hazmat.primitives.serialization模块中,需要安装cryptography库。
以下是一个使用load_pem_public_key()函数验证数字签名的例子:
首先,安装cryptography库:
pip install cryptography
然后,创建一个用于签名的私钥和公钥。可以使用cryptography.hazmat.primitives.asymmetric模块中的rsa或dsa类来生成密钥对。下面是一个使用RSA算法生成密钥对的示例:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048
)
public_key = private_key.public_key()
# 保存私钥
pem_private_key = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.NoEncryption()
)
with open('private_key.pem', 'wb') as f:
f.write(pem_private_key)
# 保存公钥
pem_public_key = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
with open('public_key.pem', 'wb') as f:
f.write(pem_public_key)
上述代码使用RSA算法生成了一个2048位的私钥和对应的公钥,并将它们保存到private_key.pem和public_key.pem文件中。
接下来,使用签名者的私钥对消息进行签名:
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
message = b'This is the message to be signed.'
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# 保存签名
with open('signature.bin', 'wb') as f:
f.write(signature)
上述代码使用签名者的私钥对消息进行签名,并将签名保存到signature.bin文件中。
最后,使用接收者的公钥对签名进行验证:
from cryptography.hazmat.primitives.asymmetric import padding
# 读取公钥
with open('public_key.pem', 'rb') as f:
pem_public_key = f.read()
public_key = serialization.load_pem_public_key(pem_public_key)
# 读取签名
with open('signature.bin', 'rb') as f:
signature = f.read()
# 验证签名
try:
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
print("验证成功!")
except InvalidSignature:
print("验证失败!")
上述代码读取接收者的公钥和签名,并使用load_pem_public_key()函数将公钥反序列化为PublicKey对象。然后,使用verify()方法验证签名,如果验证成功,则输出"验证成功!",否则输出"验证失败!"。
以上就是使用load_pem_public_key()函数验证数字签名的一个示例。请注意,在实际应用中,需要使用安全的方式传递密钥和签名,并确保密钥的安全性和完整性。
