在学习过程中遇到一段PHP函数,看不懂,想求教解释一下这个函数的每一句话。并试着推导出加密函数。谢谢
function readkey( $a1 )
{
global $_G;
$a2 = base64_decode;
$a3 = strrev;
$a4 = substr;
$a5 = authcode( $a1, "DECODE", $_G['config']['security']['authkey'] );
$a5 = $a2( $a5 );
$a6 = $a4( $a5, 0, 1 );
$a5 = $a4( $a5, 1 );
$a5 = $a3( $a4( $a5, 0, $a6 ) ).chr( ord( $a4( $a5, $a6, 1 ) ) ^ $a6 ).$a3( $a4( $a5, $a6 + 1 ) );
$a5 = $a2( $a5 );
$a5 = json_decode( $a5, TRUE );
return $a5;
}

解决方案 »

  1.   

    请贴出 authcode 函数定义
      

  2.   

     authcode就是Discuz经典的加解密函数了
    function authcode( $string, $operation = "DECODE", $key = "", $expiry = 0 )
    {
    $ckey_length = 4;
    $key = md5( $key ? $key : IC_KEY );
    $keya = md5( substr( $key, 0, 16 ) );
    $keyb = md5( substr( $key, 16, 16 ) );
    $keyc = $ckey_length ? $operation == "DECODE" ? substr( $string, 0, $ckey_length ) : substr( md5( microtime( ) ), 0 - $ckey_length ) : "";
    $cryptkey = $keya.md5( $keya.$keyc );
    $key_length = strlen( $cryptkey );
    $string = $operation == "DECODE" ? base64_decode( substr( $string, $ckey_length ) ) : sprintf( "%010d", $expiry ? $expiry + time( ) : 0 ).substr( md5( $string.$keyb ), 0, 16 ).$string;
    $string_length = strlen( $string );
    $result = "";
    $box = range( 0, 255 );
    $rndkey = array( );
    $i = 0;
    for ( ; $i <= 255; ++$i )
    {
    $rndkey[$i] = ord( $cryptkey[$i % $key_length] );
    }
    $j = $i = 0;
    for ( ; $i < 256; ++$i )
    {
    $j = ( $j + $box[$i] + $rndkey[$i] ) % 256;
    $tmp = $box[$i];
    $box[$i] = $box[$j];
    $box[$j] = $tmp;
    }
    $a = $j = $i = 0;
    for ( ; $i < $string_length; ++$i )
    {
    $a = ( $a + 1 ) % 256;
    $j = ( $j + $box[$a] ) % 256;
    $tmp = $box[$a];
    $box[$a] = $box[$j];
    $box[$j] = $tmp;
    $result .= chr( ord( $string[$i] ) ^ $box[( $box[$a] + $box[$j] ) % 256] );
    }
    if ( $operation == "DECODE" )
    {
    if ( ( substr( $result, 0, 10 ) == 0 || 0 < substr( $result, 0, 10 ) - time( ) ) && substr( $result, 10, 16 ) == substr( md5( substr( $result, 26 ).$keyb ), 0, 16 ) )
    {
    return substr( $result, 26 );
    }
    return "";
    }
    return $keyc.str_replace( "=", "", base64_encode( $result ) );
    }
      

  3.   


    其实这个加密解密函数效率不高的。$a2,$a3,$a4变量值没有带引号。