分享几种好用的PHP自定义加密函数(可逆/不可逆)
项目中有时我们需要使用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.作者投稿可能会经我们编辑修改或补充。