• Python_pycrypto_加密解密


    安装

    在 Windows环境安装 pycryptodome 模块   pip install pycryptodome 

    在 Linux环境安装 pycrypto模块   pip install pycrypto 

    使用AES实现对称加解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB,具体使用哪种根据项目情况而定。

    下面是采用 ECB并以pkcs7填充的加密与解密方法

    import base64
    
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    
    
    def aes_encrypt(secret_key, data):
        """加密数据
        :param secret_key: 加密秘钥
        :param data: 需要加密数据
        """
        data = bytes(data, encoding="utf-8")
        # 填充数据采用pkcs7
        data = pad(data, block_size=16, style="pkcs7")
        # 创建加密器
        cipher = AES.new(key=secret_key.encode("utf-8"), mode=AES.MODE_ECB)
        # 对数据进行加密
        encrypted_data = cipher.encrypt(data)
        # 对数据进行base64编码
        encrypted_data = base64.b64encode(encrypted_data)
        return encrypted_data.decode()
    
    
    def aes_decrypt(secret_key, data):
        """解密数据
        """
        data = base64.b64decode(data)
        cipher = AES.new(key=secret_key.encode("utf-8"), mode=AES.MODE_ECB)
        decrypt_data = cipher.decrypt(data)
        decrypt_data = unpad(decrypt_data, 16, style="pkcs7")
        return decrypt_data.decode("utf-8")
    
    
    if __name__ == '__main__':
        key = "22a1d4c4263e83d7f8c33a321eb19ae7"
        data = "asdASD73j8H9k6C1asvhBOK0PXOzJM7dsqXysssW"
        print("原始数据:%s" % data)
        r = aes_encrypt(key, data)
        print("加密数据:%s" % r)
        r = aes_decrypt("22a1d4c4263e83d7f8c33a321eb19ae7", r)
        print("解密数据:%s" % r)

    执行情况如下

    使用RAS实现非对称加解密

    # -*- coding: utf-8 -*-
    
    from Crypto import Random
    from Crypto.PublicKey import RSA
    from Crypto.Cipher import PKCS1_v1_5
    import base64
    
    
    def get_key():
        """生成公私钥"""
        # 生成rsa算法实例
        rsa = RSA.generate(1024, Random.new().read)
        # 生成公钥私钥
        private_pem = rsa.exportKey()
        public_pem = rsa.publickey().exportKey()
    
        return {
            "public_key": public_pem.decode(),
            "private_key": private_pem.decode()
        }
    
    
    def rsa_encrypt(data, public_key):
        """公钥加密"""
        # 加载公钥
        rsakey = RSA.importKey(public_key)
        # 生成密码器
        cipher = PKCS1_v1_5.new(rsakey)
        # 加密数据。注意,在python3中加密的数据必须是bytes类型的数据,不能是str类型的数据
        encrypt_data = cipher.encrypt(data.encode(encoding="utf-8"))
        # # 对数据进行base64编码
        encrypt_data = base64.b64encode(encrypt_data)
        # 公钥每次加密的结果不一样。原因是每次padding的数据不一样
        return encrypt_data.decode()
    
    
    def rsa_decrypt(cipher_data, private_key):
        """私钥解密"""
        # 加载私钥
        rsakey = RSA.importKey(private_key)
        # 生成密码器
        cipher = PKCS1_v1_5.new(rsakey)
        # 将密文解密成明文,返回的是一个bytes类型数据,需要自己转换成str
        decrypt_data = cipher.decrypt(base64.b64decode(cipher_data), "解密失败")
        return decrypt_data.decode()
    
    
    if __name__ == '__main__':
        # k = get_key()
        # public_key = k.get("public_key")
        # private_key = k.get("private_key")
        #
        # print(public_key)
        # print(private_key)
    
        public_key = """-----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKF7UTc5K61xMUKrCtld0dYJf/
    KjT5P+R3H8n8my8aEYqUaWQjO3CkQGsLN//5Tbs8g5Of4vAkqytoleWxSQxFGO7T
    YuOQ7UtvRhKqTKvX8PvDnKX7ebKzw3zIXt1QDRbc2bJTqVAbPDdT1DNvyocQdCMC
    BtPA2algMRs4Zq0qpwIDAQAB
    -----END PUBLIC KEY-----
        """
        private_key = """-----BEGIN RSA PRIVATE KEY-----
    MIICWwIBAAKBgQDKF7UTc5K61xMUKrCtld0dYJf/KjT5P+R3H8n8my8aEYqUaWQj
    O3CkQGsLN//5Tbs8g5Of4vAkqytoleWxSQxFGO7TYuOQ7UtvRhKqTKvX8PvDnKX7
    ebKzw3zIXt1QDRbc2bJTqVAbPDdT1DNvyocQdCMCBtPA2algMRs4Zq0qpwIDAQAB
    AoGAE3LSn0uZDFgUYvV0yU/J1sDr/8dtD6uhbgFmK+Q3VTfo8T1vQKDAx13Xr121
    SaW8Zid3doSdfbnnVIpQb45LGtM5GLLDEslSBVJ/u2pNaUF/JmwK+PZVe02g2zCX
    rtmceROdOQZo66Iq3jlV3PWcuZdTr1n6XLgbXNyMyeQHf7ECQQDNfJN/ifeXZIk6
    ouqWMGdlW6kFTCHXBGeSETqG5otfJWyvGDPOpN+950VXEObcU5y+yyGMX9CEyMNX
    B65U/nY5AkEA+8WLBoz2orSptQTB8aDsBfy7rzOnqC7cPepSzsu5oIkNxe1ZJC3j
    p0m/0UYpKOgb6RWGi4MhtdfYubMpRQ2n3wJACPoLO4Qcc9mpgQ1C8EK3EZ96d8fG
    pq0DlUb5ZpFFv2dUIyYMhVeAirxCtDYBz9g7Pb6D/azl4BchKXklbYMcSQJAViwr
    xGc090V8nG9vbiNVBUuWdYXpiV/Yk/yCsTL7at3d7/OnwgFO3PAaDifEaLLg8qsi
    bNfKDvI8xHp00qS04wJAeNJg/6C4Xwo1GYeAg2HIy0yHIQ9gs1hwA5zXdUc/7t+9
    UkZj7rd2ySQJmXsO2LU0/SvmLIjiNoG3frjWS+dqLA==
    -----END RSA PRIVATE KEY-----
        """
    
        data = "hello python!"
        cipher_data = rsa_encrypt(data, public_key)
        print(cipher_data)
    
        decrypt_data = rsa_decrypt(cipher_data, private_key)
        print(decrypt_data)

    执行结果

  • 相关阅读:
    数据恢复
    InnoDB LRU优化
    STM32 M0之SPI
    C# 添加日志文件
    VCI_CAN二次开发摘机
    [一点感触]ADF4350 ADF4111混频记
    Linux札记
    C# String与Byte数组的转换
    STM32 CAN
    stm32 F40x CCM数据区的使用
  • 原文地址:https://www.cnblogs.com/testlearn/p/16092210.html
Copyright © 2020-2023  润新知