2012-04-12 3 views
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"; 

?> 

комментировал сразу после заголовка два примера, которые работают, то раскомментируйте это один с проблемой. Как я могу ОБРАТИТЬ ОБНАРУЖЕНИЕ строки 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 

Некоторые персонаж потерял или что-то. Есть идеи?

Спасибо!

UPDATE: Еще не работает пример:

$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

ответ

1

Это неясными немного, что вы на самом деле просят здесь. Ваши функции содержат много хлама кода и могут/должны быть уменьшены до:

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

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

Причина этого не работает, как вы ожидаете, потому что XOR doess PHP не работает так, как вы надеетесь:

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

функция XOR PHP не работает на строках, где второй операнд короче что первый - он усекает возвращенную строку до длины второго операнда (отлично, если второй операнд длиннее первого - он усекает вывод до длины самого короткого операнда).

Другим возможным решением является просто расширить свой ключ, как это:

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

Это позволит убедиться, что ваш ключ больше, чем вещь вы XOR-

+0

Спасибо! Кажется, я понял это сейчас. – bsteo

Смежные вопросы