
本文详细探讨了如何将Python中的AES-ECB文件解密逻辑成功移植到PHP环境。重点解决了密钥生成、分块读取以及在处理流式数据时,尤其是PKCS#7填充机制在中间块和最终块上的差异处理。通过正确使用PHP的`openssl_decrypt`函数及其`OPENSSL_ZERO_PADDING`标志,确保了加密文件的完整解密。
在进行文件解密时,Python示例代码(如samloader项目中的crypt.py)展示了一种常见的AES-ECB模式解密流程。其核心逻辑包括:
def decrypt_progress(inf, outf, key, length):
cipher = AES.new(key, AES.MODE_ECB)
# ...
for i in range(chunks):
block = inf.read(4096)
# ...
decblock = cipher.decrypt(block)
if i == chunks - 1: # 仅对最后一个块进行unpad
outf.write(unpad(decblock))
else:
outf.write(decblock)
# ...这种分块和填充策略是移植到PHP时需要特别注意的核心。
Python代码中密钥的派生使用了MD5哈希,具体为hashlib.md5(deckey.encode()).digest()。这表示将
一个字符串deckey编码为字节串后进行MD5哈希,并获取其原始二进制摘要。
在PHP中,对应的实现方式是使用hash()函数,并将其第三个参数设置为true以获取原始二进制输出。
$deckey = "AU77D7K3SAU/D3UU"; // 示例deckey
$key = hash('md5', $deckey, true);这段PHP代码能够正确生成与Python中hashlib.md5().digest()等效的二进制密钥,这是解密成功的首要条件。
将Python的解密逻辑移植到PHP时,常见的错误是直接使用openssl_decrypt而没有正确处理填充。PHP的openssl_decrypt函数默认会尝试使用PKCS#7填充。如果输入数据(尤其是中间块)没有按照这种填充方式加密,就会导致“wrong final block length”等错误。
露阳PHP企业系统1.0
1.) 将所有文件解压到php环境中,本程序才用smarty+php+mysql设计。如果运行不了,请修改hhy文件夹下的smarty.php文件改法请看说明2.) 修改configs下的config.inc.php下的连接数据库的密码和用户名3.) 本程序没有做安全页面,人工导入sql.inc到mysql数据库。管理员初始化帐号为admin,密码为hhy。后台地址:http://你的网站地址/h
0
查看详情
根据Python的实现,我们知道:
为了在PHP中模拟这种行为,我们需要利用openssl_decrypt函数的OPENSSL_ZERO_PADDING标志。值得注意的是,OPENSSL_ZERO_PADDING这个标志的名称具有误导性,它实际上是禁用了PHP/OpenSSL的默认PKCS#7填充机制。
因此,正确的策略是:
以下是基于上述分析,将Python解密逻辑移植到PHP的完整示例代码:
<?php
$sourceFile = 'file.zip.enc4'; // 加密文件路径
$destFile = 'file.zip'; // 解密后文件路径
// 1. 密钥派生
$deckey = "AU77D7K3SAU/D3UU"; // 根据实际情况替换为正确的deckey
$key = hash('md5', $deckey, true);
// 2. 文件信息获取与打开
$chunkSize = 4096; // 与Python中读取的块大小一致
$fileSize = filesize($sourceFile); // 获取加密文件总大小
// 以二进制模式打开文件
$sourceHandle = fopen($sourceFile, 'rb');
if (!$sourceHandle) {
die("无法打开源文件: $sourceFile");
}
$destHandle = fopen($destFile, 'wb');
if (!$destHandle) {
fclose($sourceHandle);
die("无法创建目标文件: $destFile");
}
$totalBytesRead = 0; // 记录已读取的字节数
// 3. 分块读取、解密和写入
while (!feof($sourceHandle)) {
$chunk = fread($sourceHandle, $chunkSize);
if ($chunk === false || $chunk === '') { // 检查是否读取到数据或文件结束
break;
}
$currentChunkLength = strlen($chunk);
$totalBytesRead += $currentChunkLength;
// 根据当前块是否为最后一个块来决定填充模式
// 如果当前已读取字节数小于文件总大小,说明这不是最后一个块,禁用默认填充
// 否则,是最后一个块,允许默认填充 (0 表示不额外设置标志,即允许默认填充)
$paddingFlags = OPENSSL_RAW_DATA; // 始终获取原始数据
if ($totalBytesRead < $fileSize) {
$paddingFlags |= OPENSSL_ZERO_PADDING; // 禁用默认填充
}
$decryptedChunk = openssl_decrypt($chunk, 'aes-128-ecb', $key, $paddingFlags);
if ($decryptedChunk === false) {
echo "解密错误: " . openssl_error_string() . "\n";
// 根据实际需求处理错误,例如跳过、重试或终止
// 这里为了演示,我们仍然尝试写入(可能会写入损坏数据)
}
fwrite($destHandle, $decryptedChunk);
}
// 4. 关闭文件句柄
fclose($sourceHandle);
fclose($destHandle);
echo "文件解密完成: $destFile\n";
?>将Python的AES-ECB文件解密逻辑移植到PHP,核心在于精确模拟Python的密钥派生和填充处理策略。通过使用hash('md5', $data, true)获取二进制密钥,并结合openssl_decrypt的OPENSSL_RAW_DATA和条件性OPENSSL_ZERO_PADDING标志,可以确保PHP解密过程与Python行为一致。理解OPENSSL_ZERO_PADDING的真实作用(禁用默认填充)是解决“wrong final block length”错误的关键。遵循这些原则,即可成功在PHP中实现与Python兼容的文件流解密。
以上就是深入理解Python到PHP的AES文件解密移植的详细内容,更多请关注php中文网其它相关文章!
# 使用了
# 长治网络推广营销网站
# 江门seo公司咨询15火星
# 镇远网站优化推广
# 丽江网络营销推广
# 常熟网站建设哪个公司好
# 餐饮营销快手怎么做推广
# 哈尔滨网站推广价格
# 酱酒的推广营销方案
# 横岗外贸仿牌网站优化
# seo需要多少数据
# 这段
# 但在
# php
# 就会
# 或者说
# 句柄
# 尤其是
# 加密文件
# 这是
# 的是
# ssl
# 字节
# 编码
# python
相关文章:
c++中的std::basic_string的SSO优化_c++短字符串优化深度解析
css链接悬停下划线样式如何自定义_使用::after结合content和transition
Golang如何安装Swagger工具_GoSwagger文档生成环境
J*aScript动态修改指定div内所有a标签样式指南
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
iwriter统一登录平台 iwrite账号密码登录页面
理解J*aScript Promise的微任务队列与执行顺序
J*aScript:在map操作中高效处理空数组
css滚动动画效果怎么实现_使用Animate.css滚动触发动画类
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
铁路12306的积分有效期是多久_铁路12306积分有效期说明
J*a里如何使用N*igableMap进行导航操作_可导航Map操作技巧解析
顺丰国际快递查询 国际件官方查询入口
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
如何使用纯J*aScript判断Input元素是否在特定类容器内
Lar*el 8 多关键词数据库搜索优化实践
怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
HTML元素状态管理:根据DIV内容动态启用/禁用按钮
Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组
企业名称高精度匹配:N-gram方法在结构相似性分析中的应用
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
Composer如何解决json扩展缺失的错误
AWS EC2实例间SQL Server连接超时:安全组配置与故障排除指南
Composer中的^和~符号代表什么_精通Composer版本号语义化约束
12306选座系统怎么选连座_12306选座多人连坐操作方法
J*aScript中localStorage数据的获取、清洗与格式化教程
Go语言:非阻塞式判断标准输入(os.Stdin)是否有数据
打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门
QQ邮箱正确登录入口_QQ邮箱官方网站使用地址
微信语音通话掉线如何解决 微信语音通话稳定优化方法
c++中为什么推荐使用using替代typedef_c++现代化类型别名
J*aScript实现单选按钮与关联输入框的联动禁用教程
J*aScript数组对象转换:按指定键分组与值收集
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
在python-socketio事件处理器中安全访问Flask应用上下文
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
海量存储:机器视觉智能化的核心基石
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
2025-2030年全球乘用车销量预测:新能源成增长主力
PostgreSQL海量数据高效导入策略:Python与Django实践指南
PrimeNG Sidebar背景色自定义指南:CSS覆盖与主题化实践
深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射
魅族17怎样用浏览器译外语网页_iPhone魅族17浏览器译外语网页【即时翻译】
AO3网页版最新入口合集 Archive of Our Own在线访问指南
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
利用Bokeh CustomJS动态控制DataTable列可见性
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
我的世界官方游戏入口 我的世界官网平台直达链接
*请认真填写需求信息,我们会在24小时内与您取得联系。