项目

一般

简介

Python AES加密

  1. 安装依赖
    pip install pycryptodome
    
  2. 生成key和iv
    openssl rand -hex 16
    
  3. 说明
    1. ECB(Electronic Codebook)模式:
    IV:不需要。
    说明:每个块独立加密,容易受到模式攻击,不推荐用于安全敏感的应用。
    2. CBC(Cipher Block Chaining)模式:
    IV:需要。
    说明:每个块的加密依赖于前一个块的密文,提供更好的安全性。
    3. CFB(Cipher Feedback)模式:
    IV:需要。
    说明:将加密的输出反馈到输入中,支持流加密。
    4. OFB(Output Feedback)模式:
    IV:需要。
    说明:将加密的输出作为输入进行加密,适合流加密。
    5. CTR(Counter)模式:
    IV:需要(通常是一个计数器)。
    说明:将计数器与密钥进行加密,然后与明文进行异或操作,支持并行处理
    6. GCM(Galois/Counter Mode)模式:
    IV:需要。
    说明:结合了加密和认证,提供数据完整性和保密性。
    
  4. 示例1:AES 128位 CBC
    # 示例 3588上耗时约2ms
    key = bytes.fromhex("009ae63b3950b3ed6d9eec797d73753b")
    iv = bytes.fromhex("12fe02f16123ea20dbb36507b3f4e9c0")
    client_id = "0123456789" 
    password = "12345" 
    def encrypt_data():
        # 加密
        t_start = time.time()
        cipher = AES.new(key, AES.MODE_CBC, iv)  # 使用CBC模式
        time_str = str(int(time.time() * 1000))
        data = f"{client_id}\n{password}\n" + time_str
        data = data.encode()
        padded_data = pad(data, AES.block_size)
        ciphertext = cipher.encrypt(padded_data)
        ciphertext = ciphertext.hex()
        print("========================", time.time() - t_start)
    
        # 解密
        ciphertext = bytes.fromhex(ciphertext)
        decipher = AES.new(key, AES.MODE_CBC, iv=iv)  # 使用相同的密钥和IV进行解密
        decrypted_data = unpad(decipher.decrypt(ciphertext), AES.block_size)
        print("解密后的明文:", decrypted_data.decode())
    
  5. 示例2:AES 128位 CBC
    key = b"1234567890123456" 
    iv = b"abcdefghabcdefgh" 
    client_id = "0123456789" 
    password = "12345" 
    def encrypt_data():
        # 加密
        t_start = time.time()
        time_str = str(int(time.time() * 1000))
        data = f"{client_id}\n{password}\n" + time_str
        data = data.encode()
        padded_data = pad(data, AES.block_size)
        cipher = AES.new(key, AES.MODE_CBC, iv)  # 使用CBC模式
        ciphertext = cipher.encrypt(padded_data)
        ciphertext = base64.b64encode(ciphertext).decode()
        print("加密后的密文:", ciphertext)
        print("========================", time.time() - t_start)
    
        # 解密
        ciphertext = base64.b64decode(ciphertext)
        decipher = AES.new(key, AES.MODE_CBC, iv=iv)  # 使用相同的密钥和IV进行解密
        decrypted_data = unpad(decipher.decrypt(ciphertext), AES.block_size)
        print("解密后的明文:", decrypted_data.decode())
    
    if __name__ == '__main__':
        encrypt_data()
        exit()