Php 对整个字符串进行转义没有什么问题

Php 对整个字符串进行转义没有什么问题,php,Php,我有以下代码执行XOR编码/解码过程: <?php /* * Simple XOR encoder/decoder, Inkubus * */ $key = pack("H*","3cb37efae7f4f376ebbd76cd"); //$encoded = ")5/Y+F8'0P$/;"; // <- OK, Working //$decoded = 'hM5cf$350'; $encoded = "-?^<]TLV.GQV)B4[YQ "; // <-

我有以下代码执行XOR编码/解码过程:

<?php

/*
 * Simple XOR encoder/decoder, Inkubus
 *
 */

$key = pack("H*","3cb37efae7f4f376ebbd76cd");
//$encoded = ")5/Y+F8'0P$/;"; // <- OK, Working
//$decoded = 'hM5cf$350';
$encoded = "-?^<]TLV.GQV)B4[YQ   "; // <- BAD, Not working
$decoded = "CTC(*zlkb4848";
//$encoded = ')3\8?E(21@$;='; // <- OK, Working
//$decoded = 'suances06';

function decode($encoded,$key) {
  $cipher = convert_uudecode($encoded);
  $plain = $cipher ^ $key;
  $result = substr($plain, 0, strlen($cipher));
  return $result;
}

function encode($decoded,$key) {
  $plain = $decoded ^ $key;
  $result = convert_uuencode(substr($plain, 0, strlen($decoded)));
  $result = preg_replace("/\n/m","",$result);
  $result = preg_replace("/`$/m","",$result);
  return $result;
}

echo "Encoded: " . $encoded . "\n";
echo "Decoded: " . decode($encoded,$key) . "\n";
echo "Encoded: " . encode($decoded,$key) . "\n";
echo "Decoded: " . decode(encode($decoded,$key),$key) . "\n";

?>
不起作用示例:

bash-$ php xor.php
Encoded: -?^<]TLV.GQV)B4[YQ
Decoded: CTC(*zlkb484
Encoded: ,?^<]TLV.GQV)B4[Y
Decoded: CTC(*zlkb484
$encoded = "-!8H<RY67FP';C1+]R@  "; // <- BAD, Not working
$decoded = "99b1rchw00d06";
bash-$php xor.php

编码:-?^这里有点不清楚你到底在问什么。您的函数包含大量粗糙的代码,可以/应该简化为:

function decode($encoded,$key) {
  return convert_uudecode($encoded) ^ $key;
}

function encode($decoded,$key) {
  return convert_uuencode($decoded ^ $key);
}
这不能像您期望的那样工作,原因是PHP的XOR没有按照您希望的方式工作:

$a = "-?^<]TLV.GQV)B4[YQ   ";
$b = pack("H*","3cb37efae7f4f376ebbd76cd");

$c = ($a ^ $b) ^ $b;
echo $a == $c ? 'OK' : 'NOT OK';
然后,前面的示例代码将返回:

$c = str_xor(str_xor($a, $b), $b);
echo $a == $c ? 'OK' : 'NOT OK';
# outputs 'OK'
PHP的XOR函数在第二个操作数比第一个操作数短的字符串上不起作用-它将把返回的字符串截断为第二个操作数的长度(如果第二个操作数比第一个操作数长就可以了-它将输出截断为最短操作数的长度)

另一种可能的解决方案是按如下方式展开密钥:

while (strlen($key) < strlen($text)) $key .= $key;
while(strlen($key)

这将确保您的密钥比您要异或的东西长

您在这里实际要问什么还不清楚。您的函数包含大量粗糙的代码,可以/应该简化为:

function decode($encoded,$key) {
  return convert_uudecode($encoded) ^ $key;
}

function encode($decoded,$key) {
  return convert_uuencode($decoded ^ $key);
}
这不能像您期望的那样工作,原因是PHP的XOR没有按照您希望的方式工作:

$a = "-?^<]TLV.GQV)B4[YQ   ";
$b = pack("H*","3cb37efae7f4f376ebbd76cd");

$c = ($a ^ $b) ^ $b;
echo $a == $c ? 'OK' : 'NOT OK';
然后,前面的示例代码将返回:

$c = str_xor(str_xor($a, $b), $b);
echo $a == $c ? 'OK' : 'NOT OK';
# outputs 'OK'
PHP的XOR函数在第二个操作数比第一个操作数短的字符串上不起作用-它将把返回的字符串截断为第二个操作数的长度(如果第二个操作数比第一个操作数长就可以了-它将输出截断为最短操作数的长度)

另一种可能的解决方案是按如下方式展开密钥:

while (strlen($key) < strlen($text)) $key .= $key;
while(strlen($key)

这将确保你的密钥比你要异或的东西长

37个视图不是一个想法:)37个视图不是一个想法:)谢谢!我想我现在明白了。谢谢!我想我现在明白了。