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

Java与PHP生成的Base64结果不一致问题排查求助

PHP转Java加密文件处理后图片Base64编码不一致问题

之前发布过相关问题但未完全解决,现再次求助:正在将PHP端已实现的「读取加密文件,按16字节解密后拼接为字符串,再编码为Base64」功能迁移至Java,需保证Java代码输出与服务器运行的PHP代码完全一致。目前解密后的<TextData>文本数据在两端完全一致,但图片数据的Base64编码结果存在差异。

解密后文件格式

<?xml version="1.0" encoding="utf-8" ?>
<FileInfo>
    ...
    <TextData> (text data) </TextData>
</FileInfo>
(image data)

PHP端解密处理代码片段

$fileContentArray = array(16);
$transContentArray = array(16);
$fileRead = fread($fp,16);

for($i = 0 ; $i < strlen($fileRead); $i++){
    $fileContentArray[$i] = ord($fileRead[$i]);
}  
$seed->SeedDecrypt($fileContentArray,$pdwRoundKey,$transContentArray); 
$transStr =  call_user_func_array("pack",array_merge(array("C16"),$transContentArray));

$mergeStr .=  $transStr;    
}
$dataExplode = explode("<TextData>",trim($mergeStr) );
$dataExplode1 = explode("</FileInfo>",trim($dataExplode[1]) );
$dataExplode2 = explode("</TextData>",$dataExplode1[0]);
$textData = iconv("EUC-KR","utf-8",$dataExplode2[0]);
$imageData = base64_encode(trim($dataExplode1[1]));

Java端对应代码片段

byte[] fileContentArray=new byte[n];

for(int i=0;i<fileContentArray.length;i++){
    fileContentArray[i]=mergeArr[nReadCur+i];
}

seed.SeedDecrypt(fileContentArray, pdwRoundKey, outbuf);

System.arraycopy(outbuf, 0, resultArr, nReadCur, outbuf.length);

nReadCur=nReadCur+fileContentArray.length;
p=p+fileContentArray.length;
if(p>=nFileSize){
    fis.close();
    break;   
}
}//while

mergeStr=new String(resultArr,"MS949");
String[] dataExplode=mergeStr.trim().split("<TextData>");
String[] dataExplode1=dataExplode[1].trim().split("</FileInfo>");
String[] dataExplode2=dataExplode1[0].trim().split("</TextData>");

String textData = "";
String imageData = "";

textData=dataExplode2[0];
imageData=dataExplode1[1];

Encoder encoder=Base64.getEncoder();
Decoder decoder=Base64.getDecoder();
byte[] encArr=encoder.encode(imageData.trim().getBytes("MS949"));
imageData=new String(encArr,"MS949");

图片Base64编码结果差异

  • PHP结果:
R0lGODlhAwNLBPcAAAAAAAAAMwAAZgAAmQAAzAAA/wArAAArMwArZgArmQArzAAr/wBVAABVMwBVZgBVmQBVzABV/wCAAACAMwCAZgCAmQCAzACA/ ... VzpYirO0le55zF0=
  • Java结果:
R0lGODlhAwNLBD8AAAAAAAAAMwAAZgAAPwAAPwAAPwArAAArMwArZgArPwArPwArPwBVAABVMwBVZgBVPwBVPwBVPwA/AAA/MwA/ZgA/PwA/PwA/PwA/ ... DAQEAOz9GPz8/IXY=

mergeStr内容差异

  • Java端mergeStr:
GIF89aK?       3  f  ?  ?  ? +  +3 +f +? +? +? U  U3 Uf U? U? U? ?  ?3 ?f ?? ?? ?? ?  ?3 챖 첌 ぬ ? ?  ?3 ?f ??
...
J뇽杞H?*]苛⒢쬝쥻쒳뎁諾X...
A?h?~?0a?2$ @삁?d?Dd??e ...
...
WC ;홃?뿿!v
  • PHP端mergeStr:
GIF89aK?       3  f  ?  ?   +  +3 +f +? +? + U  U3 Uf U? U? U   3 f ? ?  ?  ? 챖 첌 ぬ ? ?  ? ? ? 螂 ?   3 f ? ? ...
A??~?a?$ @삁?d?Dd?e...
...
WC ;홃??v余퍙W:X뒽킉??

疑问

  1. 请问我遗漏了什么?如何让Java结果与PHP一致?
  2. mergeStr存在未添加的换行符及细微差异,这是否是编码差异导致?会影响Base64转换吗?

已尝试过用UTF-8编码,结果仍不一致;也试过一次性读取文件所有字节:

FileInputStream fis = new FileInputStream(tpf);
fis.read(mergeArr);

内容的提问来源于stack exchange,提问作者may

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:40:33