python对称加密aes
时间: 2024-12-26 10:26:53 浏览: 2
### Python 中实现 AES 对称加密
为了在 Python 中实现 AES 对称加密,可以借助 `pycryptodome` 库来完成这一操作。下面是一个完整的示例程序,展示了如何使用该库来进行 AES 加密和解密。
#### 安装必要的库
首先需要确保已经安装了所需的库:
```bash
pip3 install pycryptodome
```
#### 密钥与初始化向量 (IV)
AES 是一种分组密码算法,在 CBC 模式下工作时除了需要一个固定的密钥外还需要提供一个初始向量 IV 来增加安全性[^1]。
#### 实现 AES 加密功能
这里给出一段简单的代码用于说明如何创建 AES Cipher 对象并执行加密过程:
```python
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
def aes_encrypt(plain_text, key):
iv = get_random_bytes(AES.block_size) # 获取随机的初始化向量
cipher = AES.new(key, AES.MODE_CBC, iv=iv) # 创建新的 AES Cipher 对象
padded_data = pad(plain_text.encode(), AES.block_size) # 数据填充至块大小倍数
encrypted_data = cipher.encrypt(padded_data) # 执行加密
return iv + encrypted_data # 返回带有 IV 的密文以便后续解码使用
```
这段代码定义了一个名为 `aes_encrypt()` 函数接收两个参数——待加密字符串和平面文本形式表示的秘密钥匙;它会返回经过 AES-CBC 方式处理过的二进制数据流作为输出结果[^5]。
#### 解密已加密的数据
同样地,也可以编写相应的解密逻辑如下所示:
```python
def aes_decrypt(cipher_text_with_iv, key):
iv = cipher_text_with_iv[:AES.block_size] # 提取前缀部分即为 IV
actual_cipher_text = cipher_text_with_iv[AES.block_size:] # 去除 IV 后剩余的就是真正的密文
cipher = AES.new(key, AES.MODE_CBC, iv=iv) # 初始化一个新的 AES Cipher 对象
decrypted_padded_data = cipher.decrypt(actual_cipher_text) # 进行解密获得带填充的内容
original_message = unpad(decrypted_padded_data, AES.block_size).decode() # 移除填充恢复原始消息
return original_message
```
此函数接受之前由 `aes_encrypt()` 方法产生的完整字节数组(含 IV),以及相同的秘密键值,并最终还原成最初的纯文本信息。
#### 测试加解密流程
现在可以通过调用上述两个辅助函数验证整个加解密链路是否正常运作:
```python
if __name__ == "__main__":
secret_key = get_random_bytes(32) # 随机生成一个足够强度的秘钥
message_to_be_encrypted = "hello world"
enc_result = aes_encrypt(message_to_be_encrypted, secret_key)
dec_result = aes_decrypt(enc_result, secret_key)
print(f"Original Message: {message_to_be_encrypted}")
print(f"Encrypted Data: {enc_result.hex()}")
print(f"Decrypted Text: {dec_result}")
assert message_to_be_encrypted == dec_result, "Encryption and decryption failed!"
```
运行上面的例子将会打印出原消息、被转换后的十六进制编码格式的密文还有再次解开之后的结果,以此证明整个过程中没有任何丢失或错误发生[^4]。
阅读全文