|
|
楼主

吾爱游客
发表于 2026-1-12 03:45
|自己
1、申 请 I D:Ming379999099
2、个人邮箱:379999099@qq.com
3、原创技术文章
小白也能看懂的 Python AES 解密实战教学
—— 从报错到成功的完整踩坑指南**【原创声明】**本文为原创技术教程,记录个人在学习 AES 解密过程中的实践经验总结,所有代码均为实测可用,分享给同样在学习加解密的新手朋友。**【适用人群】**- 零基础 Python 初学者
**【环境准备】**- 系统:Windows 10/11- Python:3.8+(推荐 3.8-3.12 稳定版)- 库:pycryptodome- 工具:PowerShell 或 CMD**【前言】**第一次发帖,真的挺难各种删除各种改啊,就是付不出去,希望这次能挑战成功。本文全程用「大白话」讲解,不讲复杂加密理论,只讲「遇到什么问题→为什么会出这个问题→具体怎么解决→以后怎么避免」。我会完整还原一次真实的 AES+Base64 解密实战全过程,把新手能遇到的所有坑、报错、解决思路都讲透,看完你也能独立完成这类加密数据的解密工作。## 一、核心目标✅ 把接口传输的 Base64 密文,解密成可查看、可使用的标准 16 进制结果✅ 掌握移动端/工控/设备接口中最常见的数据解密方法---## 二、4 个必须搞懂的核心概念(白话版)### 1. AES(高级加密标准)- 可以理解为「一把加密/解密的锁」- 硬性规则:只支持 3 种固定密钥长度 - AES-128 → 密钥必须是「16 字节」 - AES-192 → 密钥必须是「24 字节」 - AES-256 → 密钥必须是「32 字节」- 本文实战用的是 **AES-128**,是最常用的规格### 2. Base64- **重要**:这不是加密!只是编码方式- 作用:把二进制数据转成「字母+数字+符号」的字符串,方便传输- 新手坑点:末尾可能缺少`=`号,解码前必须补全### 3. 填充(Padding)—— 核心难点!想象 AES 加密就像用「固定大小的盒子」打包数据,盒子容量永远是「16 字节」:- 数据刚好装满盒子 → 不需要填充- 数据装不满盒子 → 需要「填充物」塞满- 解密时:如果用了填充,需要去掉填充物(`unpad()`)- 如果没填充,却调用`unpad()` → 直接报错!### 4. 加密模式(Mode)⚠️ **重要提示**- 本文使用 **AES-ECB 模式**(最简单,适合新手)- **缺点**:相同数据加密结果相同,安全性低- **生产环境推荐**:CBC、GCM 等更安全的模式- **解密他人数据必看**:先确认对方用什么模式! - CBC 模式需要额外的 `iv` 参数 - 少了 `iv` 绝对解密失败---## 三、解密全流程图【新手救命神器】```mermaidgraph TD A[开始解密] --> B[环境准备] B --> B1[坑1: ModuleNotFoundError<br>没装加密库] B --> B2[坑2: PowerShell权限/引号问题] B --> C[处理输入数据] C --> C3[坑3: 密钥长度不对] C --> C4[坑4: Base64缺少=号] C --> C5[坑5: 密钥格式错误] C --> D[执行解密] D --> D6[坑6: 填充错误] D --> D7[坑7: 加密模式不对] D --> E[处理结果] E --> E8[坑8: 出现乱码] E --> F[✅ 成功获得16进制结果]四、初始错误脚本(包含所有典型错误)python复制下载# 初始错误脚本示例(新手常见错误大全)import base64from Crypto.Cipher import AESfrom Crypto.Util.Padding import unpad # 可能不需要# 你的数据(替换成自己的)key_str = "flsPnneMCUgxSFQKyDwfprlOarKE6pYL...(超长Base64密钥)"cipher_b64 = "+mo6xauTUlzeCQGRXFU068h4Nx1VBPksYf..."# 错误1:密钥处理 - 直接解码,没截取key_byte = base64.b64decode(key_str) # ❌ 会导致密钥长度报错# 错误2:密文处理 - 没补全=号cipher_byte = base64.b64decode(cipher_b64)# 创建解密器cipher = AES.new(key_byte, AES.MODE_ECB)# 错误3:强行解填充(可能不需要)decrypted_data = unpad(cipher.decrypt(cipher_byte), AES.block_size) # ❌ 填充报错# 错误4:强行转文本print(decrypted_data.decode('utf-8')) # ❌ 出现乱码五、实战全过程(8个阶段)阶段1:ModuleNotFoundError: No module named 'Crypto'问题:运行脚本提示找不到Crypto模块原因:没装第三方加密库解决:powershell复制下载python -m pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple注意:不要装crypto,要装pycryptodome阶段2:Incorrect AES key length (128 bytes)问题:密钥长度错误,显示128字节原因:AES-128只需要16字节,密钥太长解决:python复制下载# 补全=号 + 截取前16字节key_str += '=' * (4 - len(key_str) % 4)key_byte = base64.b64decode(key_str)[:16] # 核心:[:16]阶段3:SyntaxError: invalid character问题:脚本中有无效字符原因:Python不认识✅、📌等特殊符号解决:删掉所有特殊符号和表情,注释只用文字阶段4:ValueError: Padding is incorrect问题:填充错误原因:加密时没填充,解密时却调用了unpad()解决:python复制下载# 错误代码decrypted_data = unpad(cipher.decrypt(cipher_byte), AES.block_size)# 正确代码(删掉unpad)decrypted_data = cipher.decrypt(cipher_byte)阶段5:解密出乱码/生僻字问题:解密成功但显示乱码原因:数据是二进制,不是文本解决:二进制转16进制python复制下载# 错误:强行转文本print(decrypted_data.decode('utf-8'))# 正确:转16进制final_result = decrypted_data.hex()print("解密成功!结果:", final_result)阶段6:PowerShell报错「不允许使用与号(&)」问题:运行命令时报错解决:powershell复制下载# 方法1:加引号& "C:/Python路径/python.exe" "G:/脚本路径/脚本.py"# 方法2:修改执行策略(管理员运行)Set-ExecutionPolicy RemoteSigned# 输入Y确认阶段7:分不清密钥格式判断方法:Base64格式:字母+数字++/=组合,长度长16进制格式:0-9+A-F组合,长度32/64位对应代码:python复制下载# Base64密钥key_str += '=' * (4 - len(key_str) % 4)key_byte = base64.b64decode(key_str)[:16]# 16进制密钥key_hex = "3D85700B0CAFDE887D1A2A3529D4B6FB"key_byte = bytes.fromhex(key_hex)阶段8:成功获得16进制结果成功标志:text复制下载解密成功!最终结果:0030a5f0793d43dead0cc1643612baadfb6b3ed26a29cf7f09c7f834076dbadf...这串16进制就是你要的最终数据,可直接用于后续分析。六、完整正确脚本(3个版本)版本1:Base64密钥解密(最常用)python复制下载import base64from Crypto.Cipher import AES# 你的数据a1 = "+mo6xauTUlzeCQGRXFU068h4Nx1VBPksYf..."b1 = "flsPnneMCUgxSFQKyDwfprlOarKE6pYL..."# 处理密钥b1 += '=' * (4 - len(b1) % 4)key = base64.b64decode(b1)[:16]# 处理密文a1 += '=' * (4 - len(a1) % 4)cipher = base64.b64decode(a1)# 解密aes = AES.new(key, AES.MODE_ECB)result = aes.decrypt(cipher).hex()print("解密成功:", result)版本2:16进制密钥解密python复制下载import base64from Crypto.Cipher import AESa2 = "nH8X06MAO/N1wjjRIR8H0zSjGczDWcSp..."b2 = "3D85700B0CAFDE887D1A2A3529D4B6FB"# 16进制密钥直接转字节key = bytes.fromhex(b2)a2 += '=' * (4 - len(a2) % 4)cipher = base64.b64decode(a2)aes = AES.new(key, AES.MODE_ECB)result = aes.decrypt(cipher).hex()print("解密成功:", result)版本3:万能合一版(推荐)python复制下载import base64from Crypto.Cipher import AES# 配置区(替换成自己的数据)a1 = "+mo6xauTUlzeCQGRXFU068h4Nx1VBPksYf..."b1 = "flsPnneMCUgxSFQKyDwfprlOarKE6pYL..."a2 = "nH8X06MAO/N1wjjRIR8H0zSjGczDWcSp..."b2 = "3D85700B0CAFDE887D1A2A3529D4B6FB"def decrypt(cipher_b64, key_str, is_hex=False): # 处理密钥 if is_hex: key = bytes.fromhex(key_str) else: key_str += '=' * (4 - len(key_str) % 4) key = base64.b64decode(key_str)[:16] # 处理密文 cipher_b64 += '=' * (4 - len(cipher_b64) % 4) cipher = base64.b64decode(cipher_b64) # 解密 aes = AES.new(key, AES.MODE_ECB) return aes.decrypt(cipher).hex()# 执行解密res1 = decrypt(a1, b1) # Base64密钥res2 = decrypt(a2, b2, True) # 16进制密钥print("a1结果:", res1)print("a2结果:", res2)# 保存到文件with open("解密结果.txt", "w", encoding="utf-8") as f: f.write(f"a1结果:\n{res1}\n\na2结果:\n{res2}")print("结果已保存到【解密结果.txt】")七、8个必记避坑技巧装库别装错 → 装pycryptodome,不是crypto密钥长度是硬规则 → AES-128=16字节,超长就截取前16字节Base64必补=号 → data += '=' * (4 - len(data) % 4)填充不是必须的 → 报填充错误就先删unpad()乱码≠失败 → 二进制转16进制:.hex()先判断密钥格式 → Base64解码 or 16进制转字节PowerShell加引号 → 路径有空格必须加双引号确认加密模式 → ECB还是CBC?CBC需要iv参数八、总结:新手解密万能思路第一步:解决环境问题库装对了吗?(pycryptodome)Python能正常运行吗?终端权限够吗?第二步:解决加密规则密钥格式是什么?(Base64/16进制)密钥长度对吗?(16/32字节)什么加密模式?(ECB/CBC)需要填充吗?第三步:处理数据格式是文本数据?→ 直接打印是二进制数据?→ 转16进制【结语】解密其实并不难,所有的报错都有原因和解决方法。新手只要「按报错找原因,一步一步解决」,就能从报错到成功。这次实战我们踩了8个坑,全部解决后得到了正确结果——这就是实战的意义,也是学习的过程!友情提示:本文仅供学习交流,请勿用于非法用途实际操作时,请替换成自己的密文和密钥遇到问题可以在楼下回复,我会尽量解答测试环境:Windows 11 + Python 3.12.3 + pycryptodome 3.20.0 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|
|