zoukankan      html  css  js  c++  java
  • 介绍三种PHP加密解密算法

    PHP加密解密算法

    这里主要介绍三种常用的加密解密算法:
    方法一:

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

    使用:

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

    方法二:

     1 /**
     2  * @param $string    要加密/解密的字符串
     3  * @param $operation    类型,E 加密;D 解密
     4  * @param string $key   密钥
     5  * @return mixed|string
     6  */
     7 function encrypt($string, $operation, $key = 'encrypt')
     8 {
     9     $key = md5($key);
    10     $key_length = strlen($key);
    11     $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
    12     $string_length = strlen($string);
    13     $rndkey = $box = array();
    14     $result = '';
    15     for ($i = 0; $i <= 255; $i++) {
    16         $rndkey[$i] = ord($key[$i % $key_length]);
    17         $box[$i] = $i;
    18     }
    19     for ($j = $i = 0; $i < 256; $i++) {
    20         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
    21         $tmp = $box[$i];
    22         $box[$i] = $box[$j];
    23         $box[$j] = $tmp;
    24     }
    25     for ($a = $j = $i = 0; $i < $string_length; $i++) {
    26         $a = ($a + 1) % 256;
    27         $j = ($j + $box[$a]) % 256;
    28         $tmp = $box[$a];
    29         $box[$a] = $box[$j];
    30         $box[$j] = $tmp;
    31         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    32     }
    33     if ($operation == 'D') {
    34         if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
    35             return substr($result, 8);
    36         } else {
    37             return '';
    38         }
    39     } else {
    40         return str_replace('=', '', base64_encode($result));
    41     }
    42 }

    使用:

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

    方法三:

     1 /**
     2  * @param $data  要加密的字符串
     3  * @param $key   密钥
     4  * @return string
     5  */
     6 function encrypt($data, $key = 'encrypt')
     7 {
     8     $key = md5($key);
     9     $x = 0;
    10     $len = strlen($data);
    11     $l = strlen($key);
    12     $char = '';
    13     for ($i = 0; $i < $len; $i++) {
    14         if ($x == $l) {
    15             $x = 0;
    16         }
    17         $char .= $key{$x};
    18         $x++;
    19     }
    20     $str = '';
    21     for ($i = 0; $i < $len; $i++) {
    22         $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
    23     }
    24     return base64_encode($str);
    25 }
    26 
    27 
    28 /**
    29  * @param $data    要解密的字符串
    30  * @param $key     密钥
    31  * @return string
    32  */
    33 function decrypt($data, $key = 'encrypt')
    34 {
    35     $key = md5($key);
    36     $x = 0;
    37     $data = base64_decode($data);
    38     $len = strlen($data);
    39     $l = strlen($key);
    40     $char = '';
    41     for ($i = 0; $i < $len; $i++) {
    42         if ($x == $l) {
    43             $x = 0;
    44         }
    45         $char .= substr($key, $x, 1);
    46         $x++;
    47     }
    48     $str = '';
    49     for ($i = 0; $i < $len; $i++) {
    50         if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
    51             $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
    52         } else {
    53             $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
    54         }
    55     }
    56     return $str;
    57 }

    使用:

    1 $string = '加密字符串';
    2 // 加密
    3 $encode = encrypt($string);
    4 echo $encode . '</br>';       // Gr0DHeHrRw7KGBLcSOzj
    5 // 解密
    6 $decode = decrypt($encode);
    7 echo $decode;     // 加密字符串
  • 相关阅读:
    Container With Most Water 容器最大水容量
    socket阻塞IO流程图
    python模块time,random,os
    python生成器表达式yield,面向过程编程,部分内置函数
    python装饰器作业
    Python函数闭包装饰器
    Python函数参数,名称空间与作用域
    Linux基础3
    Linux基础2
    linux基础1
  • 原文地址:https://www.cnblogs.com/woods1815/p/9734330.html
Copyright © 2011-2022 走看看