西安力洋网站建设

西安力洋网络
  • discuz经典加密解密函数authcode解析

  • 发布者:本站 发布时间:2010/3/1 11:19:31
  • 康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
     
    原理如下,假如:

    加密

    明文:1010 1001

    密匙:1110 0011

    密文:0100 1010

    得出密文0100 1010,解密之需和密匙异或下就可以了

    解密

    密文:0100 1010

    密匙:1110 0011

    明文:1010 1001

    并没有什么高深的算法,密匙重要性很高,所以,关键在于怎么生成密匙。

    那我们一起看下康盛的authcode怎么做的吧

    1.  // 参数解释  
    2. 
    // $string: 明文 或 密文  
    3. 
    // $operation:DECODE表示解密,其它表示加密  
    4. 
    // $key: 密匙  
    5. 
    // $expiry:密文有效期  
    6. function authcode($string$operation 'DECODE'$key ''$expiry 0
    ) {  
    7.     
    // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙  
    8.     $ckey_length 4
    ;  
    9.       
    10.     
    // 密匙  
    11.     $key md5($key $key $GLOBALS['discuz_auth_key'
    ]);  
    12.       
    13.     
    // 密匙a会参与加解密  
    14.     $keya md5(substr($key016
    ));  
    15.     
    // 密匙b会用来做数据完整性验证  
    16.     $keyb md5(substr($key1616
    ));  
    17.     
    // 密匙c用于变化生成的密文  
    18.     $keyc $ckey_length ? ($operation == 'DECODE' substr($string0$ckey_length
    ):
    substr(md5(microtime()), -$ckey_length)) : ''
    ;  
    19.     
    // 参与运算的密匙  
    20.     $cryptkey $keya.md5($keya.$keyc
    );  
    21.     $key_length strlen($cryptkey
    );  
    22.     
    // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),解密时会通过这个密匙验证数据完整性  
    23.     
    // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确  
    24.     $string $operation == 'DECODE' base64_decode(substr($string$ckey_length
    )) :
    sprintf('%010d'$expiry $expiry time() : 0).substr(md5($string.$keyb), 016).$string
    ;  
    25.     $string_length strlen($string
    );  
    26.     $result ''
    ;  
    27.     $box range(0255
    );  
    28.     $rndkey 
    = array();  
    29.     
    // 产生密匙簿  
    30.     for($i 0$i <= 255$i
    ++) {  
    31.         $rndkey[$i] = ord($cryptkey[$i $key_length
    ]);  
    32.     
    }  
    33.     
    // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度  
    34.     for($j $i 0$i 256$i
    ++) {  
    35.         $j = ($j $box[$i] + $rndkey[$i]) % 256
    ;  
    36.         $tmp $box[$i
    ];  
    37.         $box[$i] = $box[$j
    ];  
    38.         $box[$j] = $tmp
    ;  
    39.     
    }  
    40.     
    // 核心加解密部分  
    41.     for($a $j $i 0$i $string_length$i
    ++) {  
    42.         $a = ($a 1) % 256
    ;  
    43.         $j = ($j $box[$a]) % 256
    ;  
    44.         $tmp $box[$a
    ];  
    45.         $box[$a] = $box[$j
    ];  
    46.         $box[$j] = $tmp
    ;  
    47.         
    // 从密匙簿得出密匙进行异或,再转成字符  
    48.         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256
    ]));  
    49.     
    }  
    50.     if($operation == 'DECODE'
    ) {  
    51.         
    // substr($result, 0, 10) == 0 验证数据有效性  
    52.         
    // substr($result, 0, 10) - time() > 0 验证数据有效性  
    53.         
    // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性  
    54.         
    // 验证数据有效性,请看未加密明文的格式  
    55.         if((substr($result010) == || substr($result010) - time() > 0) &&

    substr
    ($result1016) == substr(md5(substr($result26).$keyb), 016)) {  
    56.             return substr($result26
    );  
    57.         
    } else {  
    58.             return ''
    ;  
    59.         
    }  
    60.     
    } else {  
    61.         
    // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因  
    62.         
    // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码  
    63.         return $keyc.str_replace('='''base64_encode($result
    ));  
    64.     
    }  
    65. 

     但是有点遗憾,这个函数所有权属于康盛创想,并不能自由使用的。

  • 返回列表
    相关阅读
    更多
    深度挖掘网站的商用价值,化繁为简的设计,为企业找到直接有效的解决方案
    +86 (029) 88765320
    +86 15829904657
    地址:西安市太华北路369号
    万达广场4#23F P.C:7100001
    boss@178365.net
    在线咨询: 985224206
    互联网协会成员单位
    西安力洋之星网络技术有限公司 | 版权所有
    Copyright 2008-2020 Liyang.Inc All Rights Reserved.
    Liyang.Inc