php加密解密字符串示例
收錄了一些比較經(jīng)典的PHP加密解密函數(shù)代碼,分享給大家。加密解密原理一般都是通過(guò)一定的加密解密算法,將密鑰加入到算法中,最終得到加密解密結(jié)果。
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
// 動(dòng)態(tài)密匙長(zhǎng)度,相同的明文會(huì)生成不同密文就是依靠動(dòng)態(tài)密匙
$ckey_length = 4;
// 密匙
$key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
// 密匙a會(huì)參與加解密
$keya = md5(substr($key, 0, 16));
// 密匙b會(huì)用來(lái)做數(shù)據(jù)完整性驗(yàn)證
$keyb = md5(substr($key, 16, 16));
// 密匙c用于變化生成的密文
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length):
substr(md5(microtime()), -$ckey_length)) : '';
// 參與運(yùn)算的密匙
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用來(lái)保存時(shí)間戳,解密時(shí)驗(yàn)證數(shù)據(jù)有效性,10到26位用來(lái)保存$keyb(密匙b),
//解密時(shí)會(huì)通過(guò)這個(gè)密匙驗(yàn)證數(shù)據(jù)完整性
// 如果是解碼的話,會(huì)從第$ckey_length位開(kāi)始,因?yàn)槊芪那?ckey_length位保存 動(dòng)態(tài)密匙,以保證解密正確
$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();
// 產(chǎn)生密匙簿
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
// 用固定的算法,打亂密匙簿,增加隨機(jī)性,好像很復(fù)雜,實(shí)際上對(duì)并不會(huì)增加密文的強(qiáng)度
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;
// 從密匙簿得出密匙進(jìn)行異或,再轉(zhuǎn)成字符
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
// 驗(yàn)證數(shù)據(jù)有效性,請(qǐng)看未加密明文的格式
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 {
// 把動(dòng)態(tài)密匙保存在密文里,這也是為什么同樣的明文,生產(chǎn)不同密文后能解密的原因
// 因?yàn)榧用芎蟮拿芪目赡苁且恍┨厥庾址瑥?fù)制過(guò)程可能會(huì)丟失,所以用base64編碼
return $keyc.str_replace('=', '', base64_encode($result));
}
}
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
Linux下從零開(kāi)始安裝配置Nginx服務(wù)器+PHP開(kāi)發(fā)環(huán)境
這篇文章主要介紹了Linux下從零開(kāi)始安裝配置Nginx服務(wù)器+PHP開(kāi)發(fā)環(huán)境的教程,文中采用的是最主流的FastCGI連接方法,需要的朋友可以參考下2015-12-12
php計(jì)算多個(gè)集合的笛卡爾積實(shí)例詳解
笛卡爾積又叫笛卡爾乘積,是一個(gè)叫笛卡爾的人提出來(lái)的。 簡(jiǎn)單的說(shuō)就是兩個(gè)集合相乘的結(jié)果。具體的定義要看看有關(guān)代數(shù)系的書(shū)的定義。這篇文章主要給大家介紹了利用php計(jì)算多個(gè)集合的笛卡爾積的方法實(shí)例,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-02-02
php中使用array_filter()函數(shù)過(guò)濾空數(shù)組的實(shí)現(xiàn)代碼
這篇文章主要介紹了php中使用array_filter()函數(shù)過(guò)濾空數(shù)組的實(shí)現(xiàn)代碼,這是瀏覽PHP手冊(cè)時(shí)無(wú)意發(fā)意的一個(gè)有意思的array_filter()函數(shù)用法,需要的朋友可以參考下2014-08-08
JavaScript實(shí)現(xiàn)刪除電腦的關(guān)機(jī)鍵
本文給大家分享的是一個(gè)惡作劇小程序,使用JavaScript實(shí)現(xiàn)刪除電腦的關(guān)機(jī)鍵,非常有意思,主要是通過(guò)ActiveX操作注冊(cè)表來(lái)實(shí)現(xiàn),有需要的小伙伴可以參考下2016-07-07
學(xué)習(xí)PHP Cookie處理函數(shù)
這篇文章主要為大家詳細(xì)介紹了PHP Cookie處理函數(shù)的使用方法,感興趣的小伙伴們可以參考一下2016-08-08
php實(shí)現(xiàn)頁(yè)面純靜態(tài)的實(shí)例代碼
本篇文章主要介紹了php實(shí)現(xiàn)頁(yè)面純靜態(tài)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

