介绍三种PHP加密解密算法

匿名 (未验证) 提交于 2019-12-02 22:10:10

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;     // 加密字符串

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!