You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:09:25