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

你可能感兴趣的:(笔记,python,开发语言)