php
2012-04-12 20 views 1 likes 
1

我有下面的代码,做了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([email protected]$;='; // <- 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"; 

?> 

头之后评论说是工作的两个例子中,取消注释是一个有问题的。我怎么能GENERICALLY评论UUENCODED字符串进行解码,因此它保持不变并正确解码?评论字符串中的任何有问题的字符不是一个选项,而是整个字符串。

工作运行例如:

bash-$ php xor.php 
Encoded:)3\8?E([email protected]$;= 
Decoded: suances06 
Encoded:)3\8?E([email protected]$;= 
Decoded: suances06 

不工作例如:

bash-$ php xor.php 
Encoded: -?^<]TLV.GQV)B4[YQ 
Decoded: CTC(*zlkb484 
Encoded: ,?^<]TLV.GQV)B4[Y 
Decoded: CTC(*zlkb484 

一些字符丢失或什么的。有任何想法吗?

谢谢!

更新:另一个不工作例如:

$encoded = "-!8H<RY67FP';C1+][email protected] "; // <- BAD, Not working 
$decoded = "99b1rchw00d06"; 

冉:

bash-$ php xor.php 
Encoded: -!8H<RY67FP';C1+][email protected] 
Decoded: 99b1rchw00d0 
Encoded: ,!8H<RY67FP';C1+] 
Decoded: 99b1rchw00d0 
+0

37看法不是1个一个想法的东西不再:) – bsteo 2012-04-12 17:22:52

回答

1

这是一个有点不清楚你实际上问这里。你的函数中含有大量的冗余代码代码,并可以/应减少到:

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

function encode($decoded,$key) { 
    return convert_uuencode($decoded^$key); 
} 

像您期望这不工作的原因是因为PHP的XOR doess不行你希望的方式:

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

$c = ($a^$b)^$b; 
echo $a == $c ? 'OK' : 'NOT OK'; 

这将输出NOT OK。如果你想要一个简单的字符串XOR运算符,使用此:

function str_xor($a, $b){ 
    $out = ''; 
    for ($i=0; $i<strlen($a); $i++){ 
     $ac = ord($a{$i}); 
     $bc = ord($b{$i}); 
     $out .= chr($ac^$bc); 
    } 
    return $out; 
} 

前面的示例代码,然后将往返:

$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; 

这将确保你的关键是比你异或运算

+0

谢谢!我想我现在明白了。 – bsteo 2012-04-12 19:26:12

相关问题