分享几种好用的PHP自定义加密函数(可逆/不可逆)

最近的项目中一直有用到加密函数,今天来给大家推荐几个好用且我自己常用的加密函数,这几个都是可逆的加密函数,其中也有针对于ID的加密函数,需要的朋友可以参考下。

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

最常见的应用在用户登录以及一些API数据交换的场景。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

u=3837593897,2803417633&fm=26&gp=0.jpg

废话不多说,直接上代码。

一、第一种针对于ID的可逆加密函数,也可以用作于邀请码之类的,解密后的数据比较简单

示例:lockcode(28)=》000X unlockcode('000X')=》28

  1. //加密函数
  2. function lockcode($code) {
  3. static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
  4. $num = $code;
  5. $code = '';
  6. while ( $num > 0) {
  7. $mod = $num % 35;
  8. $num = ($num - $mod) / 35;
  9. $code = $source_string[$mod].$code;
  10. }
  11. if(emptyempty($code[3]))
  12. $code = str_pad($code,4,'0',STR_PAD_LEFT);
  13. return $code;
  14. }
  15. //解密函数
  16. function unlockcode($code) {
  17. static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
  18. if (strrpos($code, '0') !== false)
  19. $code = substr($code, strrpos($code, '0')+1);
  20. $len = strlen($code);
  21. $code = strrev($code);
  22. $num = 0;
  23. for ($i=0; $i < $len; $i++) {
  24. $num += strpos($source_string, $code[$i]) * pow(35, $i);
  25. }
  26. return $num;
  27. }

二、第二种是加密函数是我在网上搜索来的,很好用,可逆加密,支持盐值参数

示例:encrypt('abcd','1234')=》nkiV93IfJ decrypt('nkiV93IfJ','1234')=》abcd

  1. //加密函数
  2. function encrypt($data,$key='CHENI'){
  3. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  4. $nh = rand(0,64);
  5. $ch = $chars[$nh];
  6. $mdKey = md5($key.$ch);
  7. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  8. $data= base64_encode($data);
  9. $tmp = '';
  10. $i=0;$j=0;$k = 0;
  11. for ($i=0; $i<strlen($data); $i++) {
  12. $k = $k == strlen($mdKey) ? 0 : $k;
  13. $j = ($nh+strpos($chars,$data[$i])+ord($mdKey[$k++]))%64;
  14. $tmp .= $chars[$j];
  15. }
  16. return urlencode($ch.$tmp);
  17. }
  18. //解密函数
  19. function decrypt($data,$key='CHENI'){
  20. $txt = urldecode($data);
  21. $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  22. $ch = $txt[0];
  23. $nh = strpos($chars,$ch);
  24. $mdKey = md5($key.$ch);
  25. $mdKey = substr($mdKey,$nh%8, $nh%8+7);
  26. $txt = substr($txt,1);
  27. $tmp = '';
  28. $i=0;$j=0; $k = 0;
  29. for ($i=0; $i<strlen($txt); $i++) {
  30. $k = $k == strlen($mdKey) ? 0 : $k;
  31. $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]);
  32. while ($j<0) $j+=64;
  33. $tmp .= $chars[$j];
  34. }
  35. return base64_decode($tmp);
  36. }

三、第三种跟上面的比较类似,也支持盐值参数

示例:encrypt('abcd','1234')=》mZPHxw== decrypt('mZPHxw==','1234')=》abcd

  1. function encrypt($data, $key) {
  2. $char="";
  3. $str="";
  4. $key = md5($key);
  5. $x = 0;
  6. $len = strlen($data);
  7. $l = strlen($key);
  8. for ($i = 0; $i < $len; $i++) {
  9. if ($x == $l) { $x = 0; }
  10. $char .= $key{$x};
  11. $x++;
  12. }
  13. for ($i = 0; $i < $len; $i++){
  14. $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
  15. }
  16. return base64_encode($str);
  17. }
  18. function decrypt($data, $key) {
  19. $key = md5($key);
  20. $x = 0;
  21. $data = base64_decode($data);
  22. $len = strlen($data);
  23. $l = strlen($key);
  24. for ($i = 0; $i < $len; $i++) {
  25. if ($x == $l){ $x = 0;}
  26. $char .= substr($key, $x, 1);
  27. $x++;
  28. }
  29. for ($i = 0; $i < $len; $i++){
  30. if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))){
  31. $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
  32. }else{
  33. $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
  34. }
  35. }
  36. return $str;
  37. }

四、这个是我用过最好用的一个了,discuz中使用的加密解密算法

  1. //加密算法
  2. function authcode($string,$key='',$operation=false,$expiry=0){
  3. $ckey_length = 4;
  4. $key = md5($key ? $key : DEFAULT_KEYS);
  5. $keya = md5(substr($key, 0, 16));
  6. $keyb = md5(substr($key, 16, 16));
  7. $keyc = $ckey_length ? ($operation? substr($string, 0, $ckey_length):substr(md5(microtime()), -$ckey_length)) : '';
  8. $cryptkey = $keya.md5($keya.$keyc);
  9. $key_length = strlen($cryptkey);
  10. $string = $operation? base64_decode(substr($string, $ckey_length)) :
  11. sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  12. $string_length = strlen($string);
  13. $result = '';
  14. $box = range(0, 255);
  15. $rndkey = array();
  16. for($i = 0; $i <= 255; $i++) {
  17. $rndkey[$i] = ord($cryptkey[$i % $key_length]);
  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) {
  34. if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
  35. substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
  36. return substr($result, 26);
  37. } else {
  38. return '';
  39. }
  40. } else {
  41. return $keyc.str_replace('=', '', base64_encode($result));
  42. }
  43. }
  44. echo authcode('123456','key');
  45. echo '<br>';
  46. echo authcode('7d49kn9k07uSBZvha8as+/qm4UoLfpy88PFg12glPeDtlzc','key',true);