Python加密解密技巧大全

python 加密与解密

具体介绍python的加密与解密算法
例如:RSA算法


文章目录

  • python 加密与解密
  • 前言
  • 一、对称加密
  • 1、用途和特点:
  • 2、AES加密实现
  • 2.1 加密
  • 2.2 解密
  • 2.3 测试
  • 二、非对称加密
  • 1、用途和特点:
  • 2、RSA加密实现
  • 2.1 密钥生成
  • 2.2 加密
  • 2.3 解密
  • 2.4 输入输出到文件
  • 2.5 测试
  • 三、摘要算法(哈希算法)
  • 1、用途和特点:
  • 2、实现
  • 2.1 MD5加密
  • 2.2 SHA1加密
  • 2.3 SHA224加密
  • 2.4 SHA256加密
  • 2.5 归纳

  • 前言

    加密算法分散列算法、对称加密、非对称加密。

    由于计算机软件的非法复制,通信的泄密、数据安全受到威胁。一般为了安全,会要求将数据库名称、密码等信息进行加密。所以加密在开发过程中是经常使用到的技术,在一些重要场景中都有所应用,如:登录、支付、oauth等,场景不同需要搭配不一样的签名加密算法来达到业务目标。项目中用到了python端,需要用到python对密码的加密解密模块。加密算法分散列算法、对称加密、非对称加密。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、对称加密

    1、用途和特点:

    1. 对称加密使用相同的密钥来加密和解密数据。
    2. 加密和解密速度快,适合于大量数据的加密传输。
    3. 常见的对称加密算法包括 DES、AES 等。
    4. 对称加密的主要问题在于密钥管理的安全性,因为发送方和接收方都必须共享同一个密钥。

    2、AES加密实现

    AES有5种加密模式,分别是ECB, CBC, CTR, CFB, OFB。下面以AES的CBC模式为例。

    2.1 加密

    def aes_cbc_encrypt(key, iv, plaintext):
        '''
        cbc加密
        :param key:
        :param iv:
        :param plaintext: 二进制数据
        :return: 二进制数据
        '''
        # 使用 PKCS7 填充
        padder = padding.PKCS7(algorithms.AES.block_size).padder()
        padded_plaintext = padder.update(plaintext) + padder.finalize()
    
        # 创建一个 AES 加密器
        backend = default_backend()
        cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
        encryptor = cipher.encryptor()
    
        # 加密明文
        ciphertext = encryptor.update(padded_plaintext) + encryptor.finalize()
        return ciphertext
    

    2.2 解密

    def aes_cbc_decrypt(key, iv, ciphertext):
        '''
        cbc解密
        :param key:
        :param iv:
        :param ciphertext: 二进制数据
        :return: 二进制数据
        '''
        # 创建一个 AES 解密器
        backend = default_backend()
        cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
        decryptor = cipher.decryptor()
    
        # 解密
        decrypted_data = decryptor.update(ciphertext) + decryptor.finalize()
    
        # 去除填充
        unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
        unpadded_data = unpadder.update(decrypted_data) + unpadder.finalize()
        return unpadded_data
    

    2.3 测试

    def test():
    
        # 生成随机的 16 字节密钥和 IV
        key = os.urandom(16)
        iv = os.urandom(16)
    
        # 明文
        plaintext = "Hello, AES encryption with CBC mode!"
    
        # 加密
        ciphertext = aes_cbc_encrypt(key, iv, plaintext.encode())
        print("Cipher Text:", ciphertext.hex())
    
        # 解密
        decrypted_data = aes_cbc_decrypt(key, iv, ciphertext)
        print("Decrypted Text:", decrypted_data.decode())
    

    二、非对称加密

    1、用途和特点:

    1. 非对称加密使用一对密钥,公钥用于加密数据,私钥用于解密数据。
    2. 公钥是公开的,任何人都可以使用它来加密数据,而私钥是保密的,只有持有者才能解密数据。
    3. 非对称加密用于安全地交换密钥或数字签名,以确保数据的机密性和完整性。
    4. 常见的非对称加密算法包括 RSA、DSA、ECC 等。

    2、RSA加密实现

    RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥来加密和解密数据。RSA算法包括密钥生成、加密、解密三个步骤。SA算法在数据传输过程中广泛用于安全地加密敏感信息,例如在Web浏览器和服务器之间进行安全通信,数字签名,以及安全地交换对称加密密钥等方面。它是公认的安全可靠的加密算法之一。

    2.1 密钥生成

    def generate_rsa_key_pair():
        private_key = rsa.generate_private_key(
            public_exponent=65537,  # 用于生成 RSA 公钥的指数值
            key_size=2048,          # 用于生成的 RSA 密钥对的位数
            backend=default_backend()
        )
        public_key = private_key.public_key()
        return private_key, public_key
    

    2.2 加密

    def encrypt_data(data, public_key):
        encrypted_data = public_key.encrypt(
            data, padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None
            )
        )
        return encrypted_data
    

    2.3 解密

    def decrypt_data(encrypted_data, private_key):
        decrypted_data = private_key.decrypt(
            encrypted_data,
            padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None
            )
        )
        return decrypted_data
    

    2.4 输入输出到文件

    # 保存密钥对到文件
    def save_key_pair(private_key, public_key):
        with open('private_key.pem', 'wb') as f:
            f.write(private_key.private_bytes(
                encoding=serialization.Encoding.PEM,
                format=serialization.PrivateFormat.PKCS8,
                encryption_algorithm=serialization.NoEncryption()
            ))
        with open('public_key.pem', 'wb') as f:
            f.write(public_key.public_bytes(
                encoding=serialization.Encoding.PEM,
                format=serialization.PublicFormat.SubjectPublicKeyInfo
            ))
    
    
    # 从文件中加载密钥对
    def load_key_pair():
        with open('private_key.pem', 'rb') as f:
            private_key = serialization.load_pem_private_key(
                f.read(),
                password=None,
                backend=default_backend()
            )
        with open('public_key.pem', 'rb') as f:
            public_key = serialization.load_pem_public_key(
                f.read(),
                backend=default_backend()
            )
        return private_key, public_key
    

    2.5 测试

    	private_key, public_key = generate_rsa_key_pair()    # 生成公私钥
        save_key_pair(private_key, public_key)       # 将公私钥保存到文件中
    
        data = "Hello, RSA!"
        encrypted_data = encrypt_data(data.encode(), public_key)
        print("Encrypted data:", encrypted_data)
    
        decrypted_data = decrypt_data(encrypted_data, private_key)
        print("Decrypted data:", decrypted_data.decode())
    

    三、摘要算法(哈希算法)

    1、用途和特点:

    1. 摘要算法也称为哈希算法,它将任意长度的消息转换为固定长度的哈希值。
    2. 哈希值是唯一的,即使输入的消息只有微小的改动,输出的哈希值也会有很大的变化。
    3. 常见的摘要算法包括 MD5、SHA-1、SHA-256 等。
    4. 摘要算法通常用于验证数据的完整性,密码存储(使用哈希值而不是原始密码),以及生成唯一的标识符等。

    2、实现

    Python的hashlib提供了常见的摘要算法,如MD5、SHA1、SHA224、SHA256、SHA384、SHA512等算法。摘要算法又称哈希算法、散列算法。

    2.1 MD5加密

    import hashlib
    hash = hashlib.md5()
    
    hash.update("hello".encode())
    print(hash.hexdigest())
    

    2.2 SHA1加密

    import hashlib
    hash = hashlib.sha1()
    hash.update("hello".encode())
    print(hash.hexdigest())
    

    2.3 SHA224加密

    import hashlib
    hash = hashlib.sha224()
    hash.update("hello".encode())
    print(hash.hexdigest())
    

    2.4 SHA256加密

    import hashlib
    hash = hashlib.sha256()
    hash.update("hello".encode())
    print(hash.hexdigest())
    

    2.5 归纳

    在 MD5、SHA1、SHA224、SHA256、SHA384 和 SHA512 中,SHA256、SHA384 和 SHA512 等基于 SHA-2 算法族的算法通常被认为具有更强的加密性。这是因为它们提供了更大的输出长度和更强大的抗碰撞能力,使得对抗密码分析攻击更加困难。

    具体来说:

    1. SHA256 输出长度为 256 位,提供了较高的抗碰撞能力,通常被广泛应用于加密应用中。
    2. SHA384 输出长度为 384 位,提供了更高的安全性,但也会带来一定的性能损耗。
    3. SHA512 输出长度为 512 位,提供了更强的安全性,但相对于 SHA256 和 SHA384,它的计算成本更高。

    作者:mysouil

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python加密解密技巧大全

    发表回复