<?
function sample($s)
{
$hexchars = '0123456789ABCDEF';
if ( !$s || strlen($s) <= 0 )
{
echo "null string.";
return "";
}
$len = strlen($s);
$ret = '';
$curc = 0;
    $nextc = ord(substr($s, 0, 1));
for ($i=1; $i<$len; $i++ )
{
$curc = $nextc;
$nextc = ord(substr($s, $i, 1));
$curc ^= $nextc;
//echo '<br> 0x'. substr($hexchars, ($curc & 0xF0) >> 4, 1) . substr($hexchars, $curc & 0x0F, 1);
$ret .= substr($hexchars, ($curc & 0xF0) >> 4, 1);
$ret .= substr($hexchars, $curc & 0x0F, 1);
}
$curc = $nextc ^ 0x7C;
$ret .= substr($hexchars, ($curc & 0xF0) >> 4, 1);
echo $ret;
echo "<br>";
$ret .= substr($hexchars, $curc & 0x0F, 1);
return $ret;
}
$a="srvaddr=127.0.0.1";
$b=sample($a);
echo $b;
function sample2($s)
{
    //现在就想写个程序,把这个$b给还原成$a,请高手帮忙写个
}
$c=sample2($b);
echo $c;
 
 
 
 
?>

解决方案 »

  1.   

    虽然你的 sample 函数看上去很复杂,但其实只是做了相邻字符异或而已。最后一个字符与 0x7c 的异或结果是作为钥匙的
    即function encode($s) {
      $r = '';
      foreach(unpack('C*', $s) as $i=>$c) {
        if($i > 1) $r .= sprintf('%02X', $t ^ $c);
        $t = $c;
      }
      $r .= sprintf('%02X', $t ^ 0x7c);
      return $r;
    }
    他的逆运算为function decode($s) {
      $d = str_split($s, 2);
      $r = '';
      $t = 0x7c;
      while($d) {
        $c = hexdec(array_pop($d)) ^ $t;
        $r = chr($c) . $r;
        $t = $c;
      }
      return $r;
    }
    测试$a = "srvaddr=127.0.0.1";
    echo $b = encode($a), PHP_EOL;
    echo decode($b), PHP_EOL;
    0104170500164F0C0305191E1E1E1E1F4D
    srvaddr=127.0.0.1你当然可以将基本算法复杂化,以使别人不容易看懂