zoukankan      html  css  js  c++  java
  • PHP 2个比较经典的加密解密函数

    这篇文章主要介绍了2个比较经典的PHP加密解密函数分享,一个是Discuz!的authcode加密函数(带详细分解),一个是encrypt()函数,都比较经典,需要的朋友可以参考下

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这个加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。
    最常见的应用在用户登录以及一些API数据交换的场景。

    笔者收录了一些比较经典的PHP加密解密函数代码,分享给大家。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。
    1、非常给力的authcode加密函数,Discuz!经典代码(带详解):

    1. function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {     
    2.   
    3.     // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙     
    4.   
    5.     $ckey_length = 4;     
    6.   
    7.          
    8.   
    9.     // 密匙     
    10.   
    11.     $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);     
    12.   
    13.          
    14.   
    15.     // 密匙a会参与加解密     
    16.   
    17.     $keya = md5(substr($key, 0, 16));     
    18.   
    19.     // 密匙b会用来做数据完整性验证     
    20.   
    21.     $keyb = md5(substr($key, 16, 16));     
    22.   
    23.     // 密匙c用于变化生成的密文     
    24.   
    25.     $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):   
    26.   
    27. substr(md5(microtime()), -$ckey_length)) : '';     
    28.   
    29.     // 参与运算的密匙     
    30.   
    31.     $cryptkey = $keya.md5($keya.$keyc);     
    32.   
    33.     $key_length = strlen($cryptkey);     
    34.   
    35.     // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),   
    36.   
    37. //解密时会通过这个密匙验证数据完整性     
    38.   
    39.     // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确     
    40.   
    41.     $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :    
    42.   
    43. sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;     
    44.   
    45.     $string_length = strlen($string);     
    46.   
    47.     $result = '';     
    48.   
    49.     $box = range(0, 255);     
    50.   
    51.     $rndkey = array();     
    52.   
    53.     // 产生密匙簿     
    54.   
    55.     for($i = 0; $i <= 255; $i++) {     
    56.   
    57.         $rndkey[$i] = ord($cryptkey[$i % $key_length]);     
    58.   
    59.     }     
    60.   
    61.     // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度     
    62.   
    63.     for($j = $i = 0; $i < 256; $i++) {     
    64.   
    65.         $j = ($j + $box[$i] + $rndkey[$i]) % 256;     
    66.   
    67.         $tmp = $box[$i];     
    68.   
    69.         $box[$i] = $box[$j];     
    70.   
    71.         $box[$j] = $tmp;     
    72.   
    73.     }     
    74.   
    75.     // 核心加解密部分     
    76.   
    77.     for($a = $j = $i = 0; $i < $string_length; $i++) {     
    78.   
    79.         $a = ($a + 1) % 256;     
    80.   
    81.         $j = ($j + $box[$a]) % 256;     
    82.   
    83.         $tmp = $box[$a];     
    84.   
    85.         $box[$a] = $box[$j];     
    86.   
    87.         $box[$j] = $tmp;     
    88.   
    89.         // 从密匙簿得出密匙进行异或,再转成字符     
    90.   
    91.         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));     
    92.   
    93.     }     
    94.   
    95.     if($operation == 'DECODE') {    
    96.   
    97.         // 验证数据有效性,请看未加密明文的格式     
    98.   
    99.         if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&    
    100.   
    101. substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {     
    102.   
    103.             return substr($result, 26);     
    104.   
    105.         } else {     
    106.   
    107.             return '';     
    108.   
    109.         }     
    110.   
    111.     } else {     
    112.   
    113.         // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因     
    114.   
    115.         // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码     
    116.   
    117.         return $keyc.str_replace('=', '', base64_encode($result));     
    118.   
    119.     }     
    120.   
    121. }   

    函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表示解密,其它表示加密;$key:密匙;$expiry:密文有效期。

    用法:

    1. $str = 'abcdef';  
    2. $key = 'www.helloweba.com';  
    3. echo authcode($str,'ENCODE',$key,0); //加密  
    4. $str = '56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk';  
    5. echo authcode($str,'DECODE',$key,0); //解密  


    2、加解密函数encrypt():

    1. <?php  
    2. function encrypt($string,$operation,$key=''){   
    3.   
    4.     $key=md5($key);   
    5.   
    6.     $key_length=strlen($key);   
    7.   
    8.       $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;   
    9.   
    10.     $string_length=strlen($string);   
    11.   
    12.     $rndkey=$box=array();   
    13.   
    14.     $result='';   
    15.   
    16.     for($i=0;$i<=255;$i++){   
    17.   
    18.            $rndkey[$i]=ord($key[$i%$key_length]);   
    19.   
    20.         $box[$i]=$i;   
    21.   
    22.     }   
    23.   
    24.     for($j=$i=0;$i<256;$i++){   
    25.   
    26.         $j=($j+$box[$i]+$rndkey[$i])%256;   
    27.   
    28.         $tmp=$box[$i];   
    29.   
    30.         $box[$i]=$box[$j];   
    31.   
    32.         $box[$j]=$tmp;   
    33.   
    34.     }   
    35.   
    36.     for($a=$j=$i=0;$i<$string_length;$i++){   
    37.   
    38.         $a=($a+1)%256;   
    39.   
    40.         $j=($j+$box[$a])%256;   
    41.   
    42.         $tmp=$box[$a];   
    43.   
    44.         $box[$a]=$box[$j];   
    45.   
    46.         $box[$j]=$tmp;   
    47.   
    48.         $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));   
    49.   
    50.     }   
    51.   
    52.     if($operation=='D'){   
    53.   
    54.         if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){   
    55.   
    56.             return substr($result,8);   
    57.   
    58.         }else{   
    59.   
    60.             return'';   
    61.   
    62.         }   
    63.   
    64.     }else{   
    65.   
    66.         return str_replace('=','',base64_encode($result));   
    67.   
    68.     }   
    69.   
    70. }   
    71. ?>  


    函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
    用法:

      1. $str = 'abc';  
      2. $key = 'www.helloweba.com';  
      3. $token = encrypt($str, 'E', $key);  
      4. echo '加密:'.encrypt($str, 'E', $key);  
      5. echo '解密:'.encrypt($str, 'D', $key);  
  • 相关阅读:
    【转】HTML5的小知识点小集合
    11月15日下午 ajax返回数据类型为XML数据的处理
    11月15日下午 用代码操作文件(文件夹)
    11月15日上午文件上传
    11月14日用AJAX、PHP、SESSION做购物车
    各种进位制转换
    11月13日上午ajax返回数据类型为JSON数据的处理
    11月13日上午省、市、区(县)三级联动
    11月10日下午 ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情
    11月10日上午ajax基础知识、用ajax做登录页面、用ajax验证用户名是否可用、ajax动态调用数据库
  • 原文地址:https://www.cnblogs.com/myon/p/7515373.html
Copyright © 2011-2022 走看看