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

吾爱主题 阅读:159 2021-10-26 15:06:00 评论:0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以上几种都是比较好用且是我自己常用的分享给大家,大家如果想要了解其他的加密函数或者有什么建议可以在底部留言。

原文链接:https://www.php54.com/article/000h.html

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容