将C# RijndaelManaged解密逻辑转PHP,实现Excel解密转CSV
将C#的AES-ECB-PKCS7解密迁移到PHP并实现Excel转CSV
没问题,我帮你梳理清楚怎么把C#里的解密逻辑搬到PHP,同时完成解密Excel转CSV的需求。首先先明确你C#代码里的核心加密参数:
- 算法是AES(RijndaelManaged在块大小128位时和标准AES完全兼容)
- 模式用的是ECB(这种模式不需要初始化向量IV)
- 填充方式是PKCS7
- 密钥是16字节(对应AES-128,你的示例密钥刚好是16位字符串)
PHP里我们可以用自带的openssl扩展实现解密,再配合PhpSpreadsheet(PHPExcel的继任者,更稳定)来处理Excel转CSV,下面是具体步骤和代码:
1. 先搞定环境准备
- 确保你的PHP环境开了
openssl扩展(大部分默认环境都已经开启,不确定的话可以用phpinfo()查一下) - 安装PhpSpreadsheet:打开终端用Composer装就行,命令是
composer require phpoffice/phpspreadsheet
2. 实现解密逻辑(对应C#的MemoryStream处理)
C#里用MemoryStream处理加密文件的二进制内容,PHP里我们直接读文件字节流,用openssl_decrypt就能完成解密:
<?php // 和C#里的密钥保持一致,注意编码要匹配!比如C#用UTF-8转的字节,PHP直接用字符串就行 $secretKey = '050WC6tJuL@#*%^&'; $encryptedFilePath = 'Sample.xlsx.encrypted'; $tempExcelPath = 'temp_decrypted.xlsx'; // 临时存解密后的Excel,后面转CSV用 // 读取加密文件的二进制内容 $encryptedData = file_get_contents($encryptedFilePath); // 执行解密:指定AES-128-ECB算法,PKCS7填充 $decryptedData = openssl_decrypt( $encryptedData, 'AES-128-ECB', $secretKey, OPENSSL_RAW_DATA, // 告诉openssl输入是原始二进制数据 '' // ECB模式不需要IV,传空字符串就行 ); // 检查解密是否成功,失败的话打出错误信息 if ($decryptedData === false) { die('解密失败啦:' . openssl_error_string()); } // 把解密后的二进制内容写到临时Excel文件里 file_put_contents($tempExcelPath, $decryptedData); ?>
3. 把解密后的Excel转成CSV
接下来用PhpSpreadsheet加载临时Excel,然后导出成CSV:
<?php require 'vendor/autoload.php'; // 先引入PhpSpreadsheet的自动加载文件 use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Writer\Csv; $tempExcelPath = 'temp_decrypted.xlsx'; $outputCsvPath = 'Sample.csv'; // 最终要生成的CSV文件 try { // 加载刚才解密出来的临时Excel文件 $spreadsheet = IOFactory::load($tempExcelPath); // 创建CSV写入器 $writer = new Csv($spreadsheet); // 可以设置一下CSV的参数,比如加UTF-8 BOM解决中文乱码问题 $writer->setUseBOM(true); $writer->setDelimiter(','); $writer->setEnclosure('"'); // 导出CSV文件 $writer->save($outputCsvPath); // 可选:临时文件没用了就删掉 unlink($tempExcelPath); echo '搞定啦!Excel转CSV完成,文件存成:' . $outputCsvPath; } catch (Exception $e) { die('处理Excel的时候出问题了:' . $e->getMessage()); } ?>
几个要注意的坑
- 密钥编码必须一致:比如C#里如果是用
Encoding.ASCII.GetBytes(secretKey)生成的密钥字节,PHP就要用utf8_decode($secretKey)来匹配;如果C#用的是UTF-8,那PHP直接用字符串就行,不然解密出来的内容会乱。 - ECB模式的安全性:说句题外话,ECB模式本身安全性不高,生产环境尽量别用,但这里是为了兼容你原来的C#逻辑才用的。
- 填充问题:PHP的
openssl_decrypt在指定OPENSSL_RAW_DATA的时候,默认会处理PKCS7填充,不用额外操心,当然你也可以显式加上OPENSSL_PKCS7_PADDING参数。 - Excel格式支持:PhpSpreadsheet支持.xlsx、.xls这些常见格式,不管你加密的是哪种都能处理。
内容的提问来源于stack exchange,提问作者Amelio
相关产品推荐
相关产品推荐

