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(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";

?>

ヘッダーの直後にコメントされているのは機能する2つの例であり、コメントされていないのは問題のある例です。デコードするUUENCODED文字列に一般的にコメントを付けて、変更せずに正しくデコードするにはどうすればよいですか?文字列内の問題のある文字にコメントを付けることはオプションではありませんが、文字列全体をコメントすることはできません。

実行例:

bash-$ php xor.php
Encoded: )3\8?E(21@$;=
Decoded: suances06
Encoded: )3\8?E(21@$;=
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+]R@  "; // <- BAD, Not working
$decoded = "99b1rchw00d06";

蘭:

bash-$ php xor.php
Encoded: -!8H<RY67FP';C1+]R@
Decoded: 99b1rchw00d0
Encoded: ,!8H<RY67FP';C1+]
Decoded: 99b1rchw00d0
4

1 に答える 1

1

ここで実際に何を求めているのかは不明です。関数には多くのくだらないコードが含まれており、次のように減らすことができます。

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

これにより、が出力されます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関数は、2番目のオペランドが最初のオペランドよりも短い文字列では機能しません-返された文字列を2番目のオペランドの長さに切り捨てます(2番目のオペランドが最初のオペランドより長い場合は問題ありません-出力を切り捨てます最短オペランドの長さ)。

別の可能な解決策は、次のようにキーを拡張することです。

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

これにより、キーがXORしているものよりも長くなるようになります

于 2012-04-12T17:51:29.720 に答える