- 康盛的 authcode 函數能夠說對中國的PHP界做出了重大貢獻。包括康盛本身的產品,以及大部分中國使用PHP的公司都用這個函數進行加密,authcode 是使用異或運算進行加密和解密。
-
- 原理以下,假如:
-
- 加密
-
- 明文:1010 1001
-
- 密匙:1110 0011
-
- 密文:0100 1010
-
- 得出密文0100 1010,解密之需和密匙異或下就能夠了
-
- 解密
-
- 密文:0100 1010
-
- 密匙:1110 0011
-
- 明文:1010 1001
-
- 並無什麼高深的算法,密匙重要性很高,因此,關鍵在於怎麼生成密匙。
-
- 那咱們一塊兒看下康盛的authcode怎麼作的吧
-
- 1.
- 2.
- 3.
- 4.
- 5.
- 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.
- 14. $keya = md5(substr($key, 0, 16));
- 15.
- 16. $keyb = md5(substr($key, 16, 16));
- 17.
- 18. $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
- substr(md5(microtime()), -$ckey_length)) : '';
- 19.
- 20. $cryptkey = $keya.md5($keya.$keyc);
- 21. $key_length = strlen($cryptkey);
- 22.
- 23.
- 24. $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
- sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
- 25. $string_length = strlen($string);
- 26. $result = '';
- 27. $box = range(0, 255);
- 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.
- 52.
- 53.
- 54.
- 55. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
- substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
- 56. return substr($result, 26);
- 57. } else {
- 58. return '';
- 59. }
- 60. } else {
- 61.
- 62.
- 63. return $keyc.str_replace('=', '', base64_encode($result));
- 64. }
- 65. }
-
-
- 可是有點遺憾,這個函數全部權屬於康盛創想,並不能自由使用的。