项目中有时我们需要使用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