# 导入cryptography库的相关模块和函数
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
# 签名函数
def sign(data_file_name, signature_file_name, private_key_file_name):
"""
签名函数使用指定的私钥Key对文件进行签名,并将签名结果写入文件中
:param data_file_name: 待签名的数据文件
:param signature_file_name: 存放签名结果的文件
:param private_key_file_name: 用于签名的私钥文件
:return: 签名数据
"""
# 读取待签名数据
data_file = open(data_file_name, 'rb')
data = data_file.read()
data_file.close()
# 从PEM文件中读取私钥数据
key_file = open(private_key_file_name, 'rb')
key_data = key_file.read()
key_file.close()
# 从PEM文件数据中加载私钥
private_key = serialization.load_pem_private_key(
key_data,
password=None,
backend=default_backend()
)
# 使用私钥对数据进行签名
# 指定填充方式为PKCS1v15
# 指定hash方式为sha256
signature = private_key.sign(
data,
padding.PKCS1v15(),
hashes.SHA256()
)
# 将签名数据写入结果文件中
signature_file = open(signature_file_name, 'wb')
signature_file.write(signature)
signature_file.close()
# 返回签名数据
return signature
# 验签函数
def verify(data_file_name, signature_file_name, public_key_file_name):
"""
验证函数使用指定的公钥对签名结果进行验证
:param data_file_name: 原始数据文件
:param signature_file_name: 签名验证文件
:param public_key_file_name: 用于验证的公钥文件
:return: 成功返回True, 失败返回False
"""
# 读取原始数据
data_file = open(data_file_name, 'rb')
data = data_file.read()
data_file.close()
# 读取待验证的签名数据
signature_file = open(signature_file_name, 'rb')
signature = signature_file.read()
signature_file.close()
# 从PEM文件中读取公钥数据
key_file = open(public_key_file_name, 'rb')
key_data = key_file.read()
key_file.close()
# 从PEM文件数据中加载公钥
public_key = serialization.load_pem_public_key(
key_data,
backend=default_backend()
)
# 验证结果,默认为False
verify_ok = False
try:
# 使用公钥对签名数据进行验证
# 指定填充方式为PKCS1v15
# 指定hash方式为sha256
public_key.verify(
signature,
data,
padding.PKCS1v15(),
hashes.SHA256()
)
# 签名验证失败会触发名为InvalidSignature的exception
except InvalidSignature:
# 打印失败消息
print('invalid signature!')
else:
# 验证通过,设置True
verify_ok = True
# 返回验证结果
return verify_ok
#只修改这个就够了
if __name__ == '__main__':
#进行签名
# 指定数据文件
data_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/1234.txt'
# 指定签名结果文件
signature_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/签名.bin'
# 指定签名的私钥
private_key_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/签名默认私钥.pem'
# 签名并返回签名结果
signature = sign(data_file, signature_file, private_key_file)
# 打印签名数据
[print('%02x' % x, end='') for x in signature]
#验证签名
data_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/1234.txt'
signature_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/签名.bin'
public_key_file = r'C:/Users/Administrator/Desktop/RSA签名验签测试/验签默认公钥.pem'
try:
verify(data_file, signature_file, public_key_file)
print('verify ok!\n verify ok!')
except:
print('verify fail!\n verify fail!')
参考文章:https://blog.csdn.net/guyongqiangx/article/details/74454969
Python搞RSA签名和验签
最新推荐文章于 2024-05-27 15:13:55 发布