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




