2025-10-05 11:23:33 +08:00

229 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AES ECB 加密解密工具技术文档
本项目提供基于 AES 算法ECB 模式)的对称加密与解密功能,支持 PKCS7 填充、密钥标准化为 32 字节,并集成 Base64 编码/解码接口,便于字符串安全传输。
---
## 🔧 依赖库
```python
import base64
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
```
> ⚠️ 需要安装 `cryptography` 库:
>
> ```bash
> pip install cryptography
> ```
---
## 📌 功能概览
| 函数名 | 功能描述 |
|--------------------|--------|
| `pad(data)` | 使用 PKCS7 对数据进行填充,满足 AES 块大小要求128 bits |
| `unpad(data)` | 移除 PKCS7 填充 |
| `len32(key)` | 将输入密钥补足或截断至 32 字节AES-256 所需长度) |
| `aes_encrypt_ecb()`| 使用 AES-ECB 模式加密明文字符串 |
| `aes_decrypt_ecb()`| 解密 AES-ECB 密文并返回原始字符串 |
| `aes_encode_b64()` | 加密并返回 Base64 编码的结果字符串 |
| `aes_decode_b64()` | 解码 Base64 密文并执行解密 |
| `__main__` 示例 | 提供使用示例 |
---
## 📚 API 接口说明
### 1. `pad(data: bytes) -> bytes`
**功能:**
对输入字节数据使用 PKCS7 方式填充至块边界AES 块大小为 128 bits = 16 字节)。
**参数:**
- `data` (`bytes`) - 待填充的数据
**返回值:**
- `bytes` - 填充后的数据
---
### 2. `unpad(data: bytes) -> bytes`
**功能:**
移除通过 PKCS7 填充的尾部数据。
**参数:**
- `data` (`bytes`) - 已填充的加密或解密数据
**返回值:**
- `bytes` - 去除填充后的原始数据
> ❗ 若填充格式错误会抛出异常(如无效填充字节)
---
### 3. `len32(key: bytes) -> bytes`
**功能:**
将任意长度的密钥处理成固定 32 字节(即 256 位),以适配 AES-256。
**规则:**
- 若长度 < 32末尾补 `*` 字符ASCII 0x2A
- 若长度 > 32截取前 32 字节
- 若等于 32保持不变
**参数:**
- `key` (`bytes`) - 输入密钥
**返回值:**
- `bytes` - 处理后长度为 32 的密钥
> 💡 示例:
> ```python
> len32(b'abc') → b'abc*************************'
> ```
---
### 4. `aes_encrypt_ecb(key: bytes, plaintext: str) -> bytes`
**功能:**
使用 AES-ECB 模式加密明文字符串。
**参数:**
- `key` (`bytes`) - 加密密钥(自动由 `len32` 标准化)
- `plaintext` (`str`) - 明文字符串
**内部流程:**
1.`plaintext` 编码为 `'iso-8859-1'` 字节流(兼容非 UTF-8 字符)
2. 执行 PKCS7 填充
3. 创建 AES ECB 加密器并加密
4. 返回原始密文字节(未编码)
**返回值:**
- `bytes` - 加密后的二进制密文
---
### 5. `aes_decrypt_ecb(key: bytes, ciphertext: bytes) -> str`
**功能:**
解密 AES-ECB 模式的密文。
**参数:**
- `key` (`bytes`) - 解密密钥(同上,经 `len32` 处理)
- `ciphertext` (`bytes`) - 要解密的密文字节
**内部流程:**
1. 构建相同配置的解密器
2. 执行解密
3. 去除 PKCS7 填充
4. 使用 `'iso-8859-1'` 解码为字符串
**返回值:**
- `str` - 解密后的原始明文字符串
---
### 6. `aes_encode_b64(key: str, text: str) -> str`
**功能:**
加密字符串并输出 Base64 编码结果,适合网络传输或存储。
**参数:**
- `key` (`str`) - 密钥字符串(将被编码为 `'iso-8859-1'`
- `text` (`str`) - 明文内容
**流程:**
1. 密钥和文本转为 `'iso-8859-1'` 编码字节
2. 执行 `aes_encrypt_ecb`
3. 结果用 Base64 编码并转为字符串返回
**返回值:**
- `str` - Base64 形式的加密字符串
---
### 7. `aes_decode_b64(key: str, b64str: str) -> str`
**功能:**
从 Base64 编码的密文中恢复明文。
**参数:**
- `key` (`str`) - 解密密钥(需与加密时一致)
- `b64str` (`str`) - Base64 编码的密文字符串
**流程:**
1.`key``b64str` 转为 `'iso-8859-1'` 字节
2. Base64 解码得到原始密文
3. 调用 `aes_decrypt_ecb` 进行解密
4. 返回明文字符串
**返回值:**
- `str` - 解密后的原始文本
---
## ✅ 使用示例
```python
if __name__ == '__main__':
key = '67t832ufbj43riu8ewrg'
o = 'this is s test string'
b = aes_encode_b64(key, o)
t = aes_decode_b64(key, b)
print(f'{o=},{b=},{t=}')
```
**输出示例:**
```
o='this is s test string', b='dGhlIGVuY3J5cHRlZCBieXRlcw==', t='this is s test string'
```
> ✅ 可见加密后可正确还原原文。
---
## ⚠️ 安全性说明
### ❗ 不推荐在生产环境使用 ECB 模式!
- **ECB 模式缺陷**:相同的明文块加密后生成相同的密文块,容易暴露数据模式。
- **建议替代方案**:使用更安全的模式如 CBC、GCM 或 CTR并配合随机 IV 和 HMAC 认证。
> 此实现主要用于学习、兼容旧系统或特定场景,请谨慎评估安全性需求。
---
## 📝 编码说明
- 所有字符串均使用 `'iso-8859-1'` 编码进行字节转换,该编码保证每个字符对应一个字节,避免编码异常。
- 支持 ASCII 范围内的字符;若包含中文等多字节字符可能导致问题,**不建议用于 Unicode 文本直接加密**。
> 如需支持中文,请先自行编码为字节(如 UTF-8再传入加密函数。
---
## 🔄 扩展建议
| 改进建议 | 描述 |
|--------|------|
| 支持 IV 和 CBC/GCM 模式 | 提升安全性 |
| 添加 HMAC 验证 | 防止密文篡改 |
| 自定义填充方式 | 更灵活控制 |
| 异常处理增强 | 捕获解密失败、Base64 错误等 |
---
## 📎 版权与许可
MIT License可用于学习、测试及有限范围集成。
请根据实际安全需求选择是否投入生产环境。
---
📌 **作者提示:密码学应严谨对待,切勿轻率使用弱算法于敏感数据!**