You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP异或加密结果异常排查及指定加密流程实现需求

解决你的PHP加密代码XOR结果异常问题

嘿,我一眼就看到问题出在哪了——你用intval()处理二进制字符串来做XOR运算,这完全搞错了二进制转整数的逻辑!intval()默认会把字符串当成十进制数解析,比如你手里的"01010011"intval()会把它当成十进制的1010011,而不是二进制对应的83,这直接导致XOR后的结果和预期差了十万八千里。

具体错误点

你代码里这两行是罪魁祸首:

$C[$i]=sprintf("%08d",(intval($P[$i])^intval($C[$i-1]))); 
$C[$i]=sprintf("%08d",(intval($C[$i])^intval($k))); 

举个例子,intval("01010011")得到的是十进制1010011,而我们需要的是二进制转十进制的83,用这个错误的数值做XOR,结果肯定不对。

修正后的完整代码

我们需要用bindec()来正确转换二进制字符串为十进制整数,完成XOR运算后再转回8位二进制字符串。我帮你把代码改好了:

<?php 
$Ciphertext = array(); 
$C = array(); 
$iv = 0; 
$Kunci = "U"; 
$spsi= " "; 
$Plaintext =$spsi."S"; 
$c0 = sprintf("%08d", decbin($iv)); 
// 密钥转8位二进制字符串
$k = sprintf("%08d", decbin(ord($Kunci))); 
$C[0] = $c0; 
$P = array(); 

for($i = 1; $i < strlen($Plaintext); $i++){ 
    // 明文转8位二进制字符串
    $P[$i] = sprintf("%08d", decbin(ord($Plaintext[$i]))); 
    // 第一步:P[i] XOR C[i-1]
    $xor_step1 = bindec($P[$i]) ^ bindec($C[$i-1]);
    // 第二步:结果再XOR密钥K
    $xor_step2 = $xor_step1 ^ bindec($k);
    // 转成8位二进制字符串存入C[i]
    $C[$i] = sprintf("%08d", decbin($xor_step2)); 
    // 生成最终密文(取消注释即可启用)
    $Ciphertext[$i] = strtoupper(str_pad(dechex(bindec($C[$i])), 2, "0", STR_PAD_LEFT)); 
} 

echo "<br/>"; 
print_r($P); 
echo "<br/>"; 
print_r($C); 
echo "<br/>"; 
print_r($Ciphertext); 
?>

修正后结果验证

运行这段代码后,你会得到预期的结果:

  • P[1]01010011(和你给出的一致)
  • C[1]00000110(完全符合你的预期)

这完全匹配你描述的加密流程:先让明文和前一个密文做XOR,再和密钥(U对应的二进制是01010101)做XOR,得到当前密文。

小提示

  • bindec($binary_str):专门用来把二进制字符串转成十进制整数,是处理二进制运算的正确姿势。
  • decbin($decimal_num):把十进制整数转回二进制字符串,再用sprintf("%08d")补全到8位,避免前面的0丢失,保证二进制字符串的完整性。

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

火山引擎 最新活动