美工统筹SEO,为企业电子商务营销助力!
2个比拟典范的PHP加密解密函数分享
一佰互联网站建造(www.taishanly.com) 宣布日期 2020-04-29 09:01:08 阅读数: 116
名目中偶然咱们须要操纵PHP将特定的信息停止加密,也便是经由进程加密算法天生一个加密字符串,这个加密后的字符串能够经由进程解密算法停止解密,便于法式对解密后的信息停止处置。
最罕见的操纵在用户登录和一些API数据互换的场景。
笔者收录了一些比拟典范的PHP加密解密函数代码,分享给大师。加密解密道理普通都是经由进程必然的加密解密算法,将密钥插手到算法中,终究取得加密解密成果。
1、很是给力的authcode加密函数,Discuz!典范代码(带详解):
复制代码 代码以下:
function authcode($string, $operation = "DECODE", $key = "", $expiry = 0) {
// 静态密匙长度,不异的明文会天生差别密文便是依托静态密匙
$ckey_length = 4;
// 密匙
$key = md5($key ? $key : $GLOBALS["discuz_auth_key"]);
// 密匙a会到场加解密
$keya = md5(substr($key, 0, 16));
// 密匙b会用来做数据完全性考证
$keyb = md5(substr($key, 16, 16));
// 密匙c用于变更天生的密文
$keyc = $ckey_length ? ($operation == "DECODE" ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : "";
// 到场运算的密匙
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用来保管时候戳,解密时考证数占有用性,10到26位用来保管$keyb(密匙b),
//解密时会经由进程这个密匙考证数据完全性
// 若是是解码的话,会从第$ckey_length位起头,由于密文前$ckey_length位保管 静态密匙,以保障解密准确
$string = $operation == "DECODE" ? 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 == "DECODE") {
// 考证数占有用性,请看未加密明文的格局
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 {
// 把静态密匙保管在密文里,这也是为甚么一样的明文,出产差别密文后能解密的缘由
// 由于加密后的密文能够是一些特别字符,复制进程能够会丧失,以是用base64编码
return $keyc.str_replace("=", "", base64_encode($result));
}
}
函数authcode($string, $operation, $key, $expiry)中的$string:字符串,明文或密文;$operation:DECODE表现解密,别的表现加密;$key:密匙;$expiry:密文有用期。
用法:
复制代码 代码以下:
$str = "abcdef";
$key = "www.helloweba.com";
echo authcode($str,"ENCODE",$key,0); //加密
$str = "56f4yER1DI2WTzWMqsfPpS9hwyoJnFP2MpC8SOhRrxO7BOk";
echo authcode($str,"DECODE",$key,0); //解密
2、加解密函数encrypt():
复制代码 代码以下:function encrypt($string,$operation,$key=""){
$key=md5($key);
$key_length=strlen($key);
$string=$operation=="D"?base64_decode($string):substr(md5($string.$key),0,8).$string;
$string_length=strlen($string);
$rndkey=$box=array();
$result="";
for($i=0;$i<=255;$i++){
$rndkey[$i]=ord($key[$i%$key_length]);
$box[$i]=$i;
}
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=="D"){
if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){
return substr($result,8);
}else{
return"";
}
}else{
return str_replace("=","",base64_encode($result));
}
}
函数encrypt($string,$operation,$key)中$string:须要加密解密的字符串;$operation:判定是加密仍是解密,E表现加密,D表现解密;$key:密匙。
用法:
复制代码 代码以下:
$str = "abc";
$key = "www.helloweba.com";
$token = encrypt($str, "E", $key);
echo "加密:".encrypt($str, "E", $key);
echo "解密:".encrypt($str, "D", $key);
PS:对于加密手艺,本站还供给了以下加密东西供大师参考操纵:
MD5在线加密东西:http://tools.jb51.net/password/CreateMD5Password
Escape加密/解密东西:http://tools.jb51.net/password/escapepwd
在线SHA1加密东西:http://tools.jb51.net/password/sha1encode
短链(短网址)在线天生东西:http://tools.jb51.net/password/dwzcreate
短链(短网址)在线复原东西:http://tools.jb51.net/password/unshorturl
高强度暗码天生器:http://tools.jb51.net/password/CreateStrongPassword