请选择 进入手机版 | 继续访问电脑版

经典PHP加密解密函数Authcode()修复版代码

[复制链接]

经典PHP加密解密函数Authcode()修复版代码

发表于 2021-12-28 13:30:34 阅读模式 倒序浏览
1523 0 查看全部
  Authcode这个函数很多人都使用,这函数来自Discuz程序,用于加密解密字符串,可以设置钥匙(key)和过期时间,在很多时候都用得着。原版的函数代码可能会生成+、/、&这样的字符,导致通过URL传值取回时被转义,导致无法解密。火端网络稍加修改,把这几个字符替换成其它字符,解密时再替换回去,这样就完美了!
    代码如下:
  1. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0){; R$ S4 E4 H2 ~8 v+ Y8 s
  2.          
  3. - h7 d, @# a5 I! O. v% S          if($operation == 'DECODE') {6 N+ ~0 T3 M  Z) ^% B
  4.            $string = str_replace('[a]','+',$string);; v3 {' j' ^, ?6 U* c
  5.            $string = str_replace('[b]','&',$string);& W' B8 _( C( c" q% F- l, _' C
  6.            $string = str_replace('[c]','/',$string);% O% {  H. X$ t) Q/ L
  7.           }8 L# J4 d6 M- K, U% p
  8.              $ckey_length = 4;
  9. ) j& ^& f! T# }2 b             $key = md5($key ? $key : 'livcmsencryption ');% C0 o1 m6 o: f# _: D
  10.              $keya = md5(substr($key, 0, 16));7 g6 z2 P1 N/ D+ w$ K$ b
  11.              $keyb = md5(substr($key, 16, 16));
  12. 6 i, v8 o/ p; u% j) G: s" b! y6 W             $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';) U. q" Q( D, }8 I# y+ o0 p0 |
  13.              $cryptkey = $keya.md5($keya.$keyc);5 y0 w4 E. L! q* E: r) G) {8 e
  14.              $key_length = strlen($cryptkey);7 ^/ b$ \+ U3 O: [* X) j
  15.              $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  16. : {" y7 ]0 t) q% q$ v. x2 q             $string_length = strlen($string);
  17. 9 }. }. ]1 E  N, }4 [- W             $result = '';& C* U+ ?" ^5 C5 I
  18.              $box = range(0, 255);! P: }9 a( J3 h; m( L  G
  19.              $rndkey = array();
  20. 3 d' u. x2 @! c0 c4 g             for($i = 0; $i <= 255; $i++) {0 p$ E8 i: ~) ~6 N1 o+ O
  21.                  $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  22. 3 i. E3 T. J- D' p: l2 v             }
  23. ) H7 B. ]( n. u. ~             for($j = $i = 0; $i < 256; $i++) {  K/ O' F  K  D2 Z' D
  24.                  $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  25. * t" j1 _- l" E  X( D6 @* a                 $tmp = $box[$i];
  26. 6 }9 a0 q: a' Q                 $box[$i] = $box[$j];
  27. ! d6 n5 |3 {8 m5 C                 $box[$j] = $tmp;
  28. 4 O5 U$ R, ~5 W+ f9 ?. x             }1 Z* P" a* g; I' Y% ?. x$ ?
  29.              for($a = $j = $i = 0; $i < $string_length; $i++) {
  30. # Y9 T0 u5 }, o- h0 l# g; }                 $a = ($a + 1) % 256;
  31. ' ~$ [4 j$ H$ H1 j                 $j = ($j + $box[$a]) % 256;+ @* f, F6 U( e# ~! w
  32.                  $tmp = $box[$a];
  33. % ^  s  m4 R. R8 y5 B- ^                 $box[$a] = $box[$j];) [, i  q* @6 J9 B/ A, x
  34.                  $box[$j] = $tmp;; e' I2 i! R/ V" I8 R& M% [2 P
  35.                  $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));8 ]' [  H( F' h( T
  36.              }6 _7 c  L+ \$ Q9 G
  37.              if($operation == 'DECODE') {
  38. ; f$ \7 X% c' i/ I* n" s7 J* Q                 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  39. ; h" J6 N% y1 Q2 I& K6 _            
  40. # S1 b+ {* I6 I4 ^                     return substr($result, 26);/ E( z  T+ l: L) D  ]8 O5 }
  41.                  } else {9 z. A8 I9 \& ~) H9 s0 X
  42.                      return '';4 i- x! `- @. `
  43.                  }
  44. / ~7 Y4 M0 U, V0 _             } else {
  45. - R! p3 {# ?* B1 ?9 Y2 n( l           $ustr = $keyc.str_replace('=', '', base64_encode($result));
  46. 3 t2 q+ o* b- U( s8 Y* ^% ]           $ustr = str_replace('+','[a]',$ustr);4 G# E3 k3 {! Y) s
  47.            $ustr = str_replace('&','[b]',$ustr);
  48. 9 e& c+ f% e7 d( t. ^' b           $ustr = str_replace('/','[c]',$ustr);
  49. * N/ Y4 N' {& A; o6 E& P                 return $ustr;( N- J3 f& T% J, |7 k- N& f/ I
  50.              }; z% V8 q, [+ W: c3 i& ]4 c6 f
  51.     }
复制代码



回复

使用道具 举报

游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|极客同行 ( 蜀ICP备17009389号-1 )

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4