Python实现AES加密解密:含代码示例与关键注意点
下面是一个使用Python实现的AES加密和解密的示例代码,AES是一种对称加密算法,会生成16轮子密钥。 ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad from Crypto.Protocol.KDF import PBKDF2 from Crypto.Random import get_random_bytes # 加密函数 def encrypt(plaintext, key): # 生成盐值 salt = get_random_bytes(16) # 使用PBKDF2函数从密钥和盐值生成AES密钥 aes_key = PBKDF2(key, salt, dkLen=32) # 创建AES加密器,使用CBC模式 cipher = AES.new(aes_key, AES.MODE_CBC) # 对明文进行填充 padded_plaintext = pad(plaintext.encode(), AES.block_size) # 加密填充后的明文 ciphertext = cipher.encrypt(padded_plaintext) # 返回盐值、初始化向量、16轮子密钥(这里简单用AES密钥替代)和密文 return salt, cipher.iv, aes_key, ciphertext # 解密函数 def decrypt(ciphertext, key, salt, iv): # 使用PBKDF2函数从密钥和盐值生成AES密钥 aes_key = PBKDF2(key, salt, dkLen=32) # 创建AES解密器,使用CBC模式 cipher = AES.new(aes_key, AES.MODE_CBC, iv) # 解密密文 decrypted_data = cipher.decrypt(ciphertext) # 去除填充 unpadded_data = unpad(decrypted_data, AES.block_size) # 返回16轮子密钥(这里简单用AES密钥替代)和明文 return aes_key, unpadded_data.decode() # 示例使用 plaintext = "Hello, World!" key = "MySecretKey" # 加密 salt, iv, encryption_subkeys, ciphertext = encrypt(plaintext, key) print("16轮子密钥(简单用AES密钥替代):", encryption_subkeys.hex()) print("密文:", ciphertext.hex()) # 解密 decryption_subkeys, decrypted_plaintext = decrypt(ciphertext, key, salt, iv) print("16轮子密钥(简单用AES密钥替代):", decryption_subkeys.hex()) print("明文:", decrypted_plaintext) ``` 代码注释解释: 1. `encrypt`函数: - 生成盐值用于密钥派生。 - 使用`PBKDF2`函数从密钥和盐值生成AES密钥。 - 创建AES加密器,使用CBC模式。 - 对明文进行填充后加密。 - 返回盐值、初始化向量、16轮子密钥(这里简单用AES密钥替代)和密文。 2. `decrypt`函数: - 使用`PBKDF2`函数从密钥和盐值生成AES密钥。 - 创建AES解密器,使用CBC模式。 - 解密密文并去除填充。 - 返回16轮子密钥(这里简单用AES密钥替代)和明文。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 密钥管理:密钥的安全性至关重要,避免硬编码密钥,建议使用安全的密钥存储方式。 2. 填充问题:在加密和解密过程中,填充和解填充的方式必须一致,否则会导致解密失败。 3. 初始化向量(IV):IV必须是随机的,并且在加密和解密过程中要正确传递,否则会影响加密的安全性。 ######[AI写代码神器 | 836点数解答 | 2025-10-14 16:35:32]
- Python实现AES加密解密:含代码示例与关键注意点(字节豆包 | 836点数解答 | 2025-10-14 16:35:32)66
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- Java实现链表反转:迭代与递归双解法详解及开发实战指南(DeepSeek | 1409点数解答 | 2026-03-15 15:09:29)22
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 代码纠错:从“std::uno”笔误到完整 C++ 网络程序的修正与优化(阿里通义 | 465点数解答 | 2024-11-23 20:41:37)240
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- 探寻数组中最长摆动子序列长度:思路剖析与代码优化(GPT | 758点数解答 | 2024-12-23 23:18:29)264
- 独家剖析:求解数组最长摆动子序列长度的代码实现与改进建议(GPT | 350点数解答 | 2024-12-23 23:20:54)261
- Python 程序控制结构破解古代算经“百钱买百鸡”不定方程问题( | 87点数解答 | 2024-11-02 16:34:14)154
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- Three.js 示例代码解析:优化场景渲染与注意要点(字节豆包 | 164点数解答 | 2025-02-27 23:30:20)257