首頁 > 後端開發 > php教程 > 经典PHP加密解密函数Authcode()分享

经典PHP加密解密函数Authcode()分享

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-06-20 13:03:19
原創
1420 人瀏覽過

Authcode这个函数很多人都使用,这函数来自Discuz程序,用于加密解密字符串,可以设置钥匙(key)和过期时间,在很多时候都用得着。原版的函数代码可能会生成+、/、&这样的字符,导致通过URL传值取回时被转义,导致无法解密。稍加修改,把这几个字符替换成其它字符,解密时再替换回去,这样就完美了!

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){

    

 if($operation == 'DECODE') {

 $string = str_replace('[a]','+',$string);

 $string = str_replace('[b]','&',$string);

 $string = str_replace('[c]','/',$string);

 }

 $ckey_length = 4;

 $key = md5($key ? $key : 'livcmsencryption ');

 $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()), -$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();

 for($i = 0; $i <= 255; $i++) {

  $rndkey[$i] = ord($cryptkey[$i % $key_length]);

 }

 for($j = $i = 0; $i < 256; $i++) {

  $j = ($j + $box[$i] + $rndkey[$i]) % 256;

  $tmp = $box[$i];

  $box[$i] = $box[$j];

  $box[$j] = $tmp;

 }

 for($a = $j = $i = 0; $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 == &#39;DECODE&#39;) {

  if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {

    

   return substr($result, 26);

  } else {

   return &#39;&#39;;

  }

 } else {

 $ustr = $keyc.str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));

 $ustr = str_replace(&#39;+&#39;,&#39;[a]&#39;,$ustr);

 $ustr = str_replace(&#39;&&#39;,&#39;[b]&#39;,$ustr);

 $ustr = str_replace(&#39;/&#39;,&#39;[c]&#39;,$ustr);

  return $ustr;

 }

}

登入後複製

 


相關標籤:
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
PHP substr() 函數
來自於 1970-01-01 08:00:00
0
0
0
如何透過JavaScript呼叫PHP函數?
來自於 1970-01-01 08:00:00
0
0
0
PHP 巢狀函數與匿名函數作用域問題
來自於 1970-01-01 08:00:00
0
0
0
php程式碼寫出求相關係數函數?
來自於 1970-01-01 08:00:00
0
0
0
高版本php好像已經不支援mysql_connect函數了
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板