栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python搞RSA签名和验签

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python搞RSA签名和验签

# 导入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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942793.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号