• python_cryptography_加密解密


    安装

    使用pip安装

    pip install cryptography

    加密与解密

    有时会将一些数据发送到不受信任的环境。但是如何安全地做到这一点?诀窍就是签名。只要知道一个密钥,您就可以对数据进行加密签名并将其移交给其他人。当您取回数据时,可以轻松确保没有人篡改数据。使用cryptography可以实现此种方案。

    from cryptography.fernet import Fernet
    
    
    # =========生成密钥============
    secret_key = Fernet.generate_key()  # 加密key
    print("密钥", secret_key)
    
    # =========加密数据============
    msg = "hello python"
    
    cipher = Fernet(secret_key)
    ret = cipher.encrypt(msg.encode("utf-8"))
    print("加密数据", ret.decode("utf-8"))
    
    # =========解密数据============
    msg = cipher.decrypt(ret)
    print("解密数据", msg.decode("utf-8"))

    执行结果

    强调说明

    只要你保管好你的密钥,并且密钥足够复杂,一切就OK的!

    简单封装

    from cryptography.fernet import Fernet
    
    
    def generate_key():
        return Fernet.generate_key()
    
    
    class Cipher:
    
        def __init__(self, secret_key=None):
            if secret_key is None:
                secret_key = "Oe4PWwBs0oEKnYlmWUZcFehfHv2AWPTU8J7tH0un3YI"
            if not isinstance(secret_key, bytes):
                secret_key = secret_key.encode()
            self.cipher = Fernet(secret_key)
    
        def encrypt(self, data):
            encrypt_data = self.cipher.encrypt(data.encode("utf-8")).decode()
            return encrypt_data
    
        def decrypt(self, encrypt_data):
            decrypt_data = self.cipher.decrypt(encrypt_data.encode("utf-8")).decode()
            return decrypt_data
    
    
    if __name__ == '__main__':
        sk = generate_key()
        c = Cipher(sk)
        e = c.encrypt("asd")
        d = c.decrypt(e)
        print(e)
        print(d)

    AES的ECB加密与解密

    from cryptography.hazmat.primitives import padding
    from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
    from cryptography.hazmat.backends import default_backend
    
    import base64
    
    block_size = 128
    
    
    def aes_encrypt(secret_key, data):
        """加密数据
        :param secret_key: 加密秘钥
        :param data: 需要加密数据
        """
        # 将数据转换为byte类型
        data = data.encode("utf-8")
        secret_key = secret_key.encode("utf-8")
    
        # 填充数据采用pkcs7
        padder = padding.PKCS7(block_size).padder()
        pad_data = padder.update(data) + padder.finalize()
    
        # 创建密码器
        cipher = Cipher(
            algorithms.AES(secret_key),
            mode=modes.ECB(),
            backend=default_backend()
        )
        # 加密数据
        encryptor = cipher.encryptor()
        encrypted_data = encryptor.update(pad_data)
        return base64.b64encode(encrypted_data).decode()
    
    
    def aes_decrypt(secret_key, data):
        """解密数据
        """
        secret_key = secret_key.encode("utf-8")
        data = base64.b64decode(data)
    
        # 创建密码器
        cipher = Cipher(
            algorithms.AES(secret_key),
            mode=modes.ECB(),
            backend=default_backend()
        )
        decryptor = cipher.decryptor()
        decrypt_data = decryptor.update(data)
        unpadder = padding.PKCS7(block_size).unpadder()
        unpad_decrypt_data = unpadder.update(decrypt_data) + unpadder.finalize()
        return unpad_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)

    执行结果

    上面实现方式也可以用 pycrypto 实现,具体参考:https://www.cnblogs.com/testlearn/p/16092210.html

    强调说明

    注意block_size单位在cryptography是bit,pycrypto是byte

  • 相关阅读:
    js中$
    js中 javascript:void(0) 用法详解
    Git关于pull,commit,push的总结
    k8s记录-docker-compose脚本参考
    k8s记录-docker部署mysql和nginx
    Linux记录-ssh批量双向无密码登录
    Linux记录-ssh无密码执行脚本
    Linux记录-一些常用操作
    k8s记录-Dockerfile详解
    k8s记录-kubectl常用命令
  • 原文地址:https://www.cnblogs.com/testlearn/p/16177034.html
Copyright © 2020-2023  润新知