zoukankan      html  css  js  c++  java
  • php三种常用的加密解密算法

    方法一:

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

    使用:

     1 $string = '加密字符串';
     2 
     3 // 加密
     4 
     5 $encode = authcode($string, 'ENCODE');
     6 
     7 echo $encode . '</br>';       // a2f4bSYyUrTum1nAAA9X9BrC4Z3DZazcSa4eLcvDoCnmYc1LTdvtqS4aCds
     8 
     9 // 解密
    10 
    11 $decode = authcode($encode, 'DECODE');
    12 
    13 echo $decode;     // 加密字符串

    方法二:

     1 /**
     2 
     3  * @param $string    要加密/解密的字符串
     4 
     5  * @param $operation    类型,E 加密;D 解密
     6 
     7  * @param string $key   密钥
     8 
     9  * @return mixed|string
    10 
    11  */
    12 
    13 function encrypt($string, $operation, $key = 'encrypt')
    14 
    15 {
    16 
    17     $key = md5($key);
    18 
    19     $key_length = strlen($key);
    20 
    21     $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
    22 
    23     $string_length = strlen($string);
    24 
    25     $rndkey = $box = array();
    26 
    27     $result = '';
    28 
    29     for ($i = 0; $i <= 255; $i++) {
    30 
    31         $rndkey[$i] = ord($key[$i % $key_length]);
    32 
    33         $box[$i] = $i;
    34 
    35     }
    36 
    37     for ($j = $i = 0; $i < 256; $i++) {
    38 
    39         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    40 
    41         $tmp = $box[$i];
    42 
    43         $box[$i] = $box[$j];
    44 
    45         $box[$j] = $tmp;
    46 
    47     }
    48 
    49     for ($a = $j = $i = 0; $i < $string_length; $i++) {
    50 
    51         $a = ($a + 1) % 256;
    52 
    53         $j = ($j + $box[$a]) % 256;
    54 
    55         $tmp = $box[$a];
    56 
    57         $box[$a] = $box[$j];
    58 
    59         $box[$j] = $tmp;
    60 
    61         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    62 
    63     }
    64 
    65     if ($operation == 'D') {
    66 
    67         if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
    68 
    69             return substr($result, 8);
    70 
    71         } else {
    72 
    73             return '';
    74 
    75         }
    76 
    77     } else {
    78 
    79         return str_replace('=', '', base64_encode($result));
    80 
    81     }
    82 
    83 }

    使用:

     1 $string = '加密字符串';
     2 
     3 // 加密
     4 
     5 $encode = encrypt($string, 'E');
     6 
     7 echo $encode . '</br>';       // 0Jzym5UzkRKH726U7Pyt7ixzLz9YEEA
     8 
     9 // 解密
    10 
    11 $decode = encrypt($encode, 'D');
    12 
    13 echo $decode;     // 加密字符串

    方法三:

      1 /**
      2 
      3  * @param $data  要加密的字符串
      4 
      5  * @param $key   密钥
      6 
      7  * @return string
      8 
      9  */
     10 
     11 function encrypt($data, $key = 'encrypt')
     12 
     13 {
     14 
     15     $key = md5($key);
     16 
     17     $x = 0;
     18 
     19     $len = strlen($data);
     20 
     21     $l = strlen($key);
     22 
     23     $char = '';
     24 
     25     for ($i = 0; $i < $len; $i++) {
     26 
     27         if ($x == $l) {
     28 
     29             $x = 0;
     30 
     31         }
     32 
     33         $char .= $key{$x};
     34 
     35         $x++;
     36 
     37     }
     38 
     39     $str = '';
     40 
     41     for ($i = 0; $i < $len; $i++) {
     42 
     43         $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
     44 
     45     }
     46 
     47     return base64_encode($str);
     48 
     49 }
     50 
     51  
     52 
     53  
     54 
     55 /**
     56 
     57  * @param $data    要解密的字符串
     58 
     59  * @param $key     密钥
     60 
     61  * @return string
     62 
     63  */
     64 
     65 function decrypt($data, $key = 'encrypt')
     66 
     67 {
     68 
     69     $key = md5($key);
     70 
     71     $x = 0;
     72 
     73     $data = base64_decode($data);
     74 
     75     $len = strlen($data);
     76 
     77     $l = strlen($key);
     78 
     79     $char = '';
     80 
     81     for ($i = 0; $i < $len; $i++) {
     82 
     83         if ($x == $l) {
     84 
     85             $x = 0;
     86 
     87         }
     88 
     89         $char .= substr($key, $x, 1);
     90 
     91         $x++;
     92 
     93     }
     94 
     95     $str = '';
     96 
     97     for ($i = 0; $i < $len; $i++) {
     98 
     99         if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
    100 
    101             $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
    102 
    103         } else {
    104 
    105             $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
    106 
    107         }
    108 
    109     }
    110 
    111     return $str;
    112 
    113 }

    使用:

     1 $string = '加密字符串';
     2 
     3 // 加密
     4 
     5 $encode = encrypt($string);
     6 
     7 echo $encode . '</br>';       // Gr0DHeHrRw7KGBLcSOzj
     8 
     9 // 解密
    10 
    11 $decode = decrypt($encode);
    12 
    13 echo $decode;     // 加密字符串
  • 相关阅读:
    window10-jmeter安装
    软件开发模型
    软件测试的原则和流程
    手机APP测试
    优秀的软件测试工程师
    自动化测试
    测试用例
    软件测试功能分类
    ios-prefix文件最全
    催收策略及催收评分卡搭建
  • 原文地址:https://www.cnblogs.com/sgm4231/p/9773658.html
Copyright © 2011-2022 走看看