项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。
最常见的应用在用户登录以及一些API数据交换的场景。
最常见的应用在用户登录以及一些API数据交换的场景。
笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
1、非常给力的authcode加密函数,discuz!经典代码(带详解):
1 function authcode($string,$operation = 'DECODE',1)">$key = '',1)">$expiry = 0) { 2 // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 3 $ckey_length = 4; 4 5 密匙 6 $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); 7 8 密匙a会参与加解密 9 $keya = md5(substr($key,16)); 10 密匙b会用来做数据完整性验证 11 $keyb = 12 密匙c用于变化生成的密文 13 $keyc = $ckey_length ? ($operation == 'DECODE' ? $ckey_length): 14 substr(microtime()),-$ckey_length)) : ''15 参与运算的密匙 16 $cryptkey = $keya.$keya.$keyc); 17 $key_length = strlen($cryptkey18 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b), 19 //解密时会通过这个密匙验证数据完整性 20 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 21 $string = base64_decode($ckey_length)) : 22 sprintf('%010d',1)">$expiry ? $expiry + time() : 0).$string.$keyb),16).$string23 $string_length = 24 $result = ''25 $Box = range(0,25526 $rndkey = array(); 27 产生密匙簿 28 for($i = 0; $i <= 255; $i++29 $rndkey[$i] = ord($cryptkey[$i % $key_length30 } 31 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 32 $j = $i < 256; 33 $j = ($j + $Box[$i] + $i]) % 25634 $tmp = $i]; 35 $i] = $j36 $j] = $tmp37 38 核心加解密部分 39 $a = $i < $string_length; 40 $a = ($a + 1) % 25641 $a]) % 25642 $a43 $a] = 44 45 从密匙簿得出密匙进行异或,再转成字符 46 $result .= chr($string[$i]) ^ ($Box[($a] + $j]) % 256])); 47 48 if($operation == 'DECODE') { 49 验证数据有效性,请看未加密明文的格式 50 if(($result,10) == 0 || time() > 0) && 51 )) { 52 return 53 } else { 54 return ''55 } 56 } 57 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 58 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 59 return $keyc.str_replace('=','',base64_encode($result60 61 }
函数authcode($string,$operation,$key,$expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。
用法:
1 $str = 'abcdef'; 2 $key = 'www.fyunw.com'3 $authcode = authcode($str,'ENCODE',0); 加密 4 echo $authcode; 5 echo authcode($authcode,'DECODE',1)">解密
2、加解密函数encrypt():
function encrypt($operation,1)">$key=''){ 2 $key=$key); $key_length= 4 $string=$operation=='D'?base64_decode($string):$key),8). 5 $string_length=$rndkey=$Box=(); 7 $result=''$i=0;$i<=255; 9 $i]=$key[$i%]); 10 $i]=11 } $j=$i<256;13 $j=($j+$i]+$i])%25614 $tmp=]; 15 16 $j]=17 $a=$i<$string_length;19 $a=($a+1)%25620 $a])%25621 22 $a]=23 24 $result.=$i])^($a]+$j])%256])); 25 26 $operation=='D'27 if()){ 28 29 }{ 30 return''31 } 32 }33 )); 34 35 }
函数encrypt($string,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
用法:
$str = 'abc'$token = encrypt(echo '加密:'.encrypt(echo '解密:'.encrypt($key);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。