Python AES加密¶
- 安装依赖
pip install pycryptodome
- 生成key和iv
openssl rand -hex 16
- 说明
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:需要。 说明:结合了加密和认证,提供数据完整性和保密性。
- 示例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())
- 示例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()