PHP資料加密和解密
阿新 • • 發佈:2018-12-30
<?php /** * Passport 加密函式 * * @param string 等待加密的原字串 * @param string 私有密匙(用於解密和加密) * * @return string 原字串經過私有密匙加密後的結果 */ function passport_encrypt($txt, $key){ // 使用隨機數發生器產生 0~64000 的值並 MD5() $encrypt_key = md5(rand(0, 64000)); // 變數初始化 $ctr = 0; $tmp = ''; // for 迴圈,$i 為從 0 開始,到小於 $txt 字串長度的整數 for($i = 0; $i < strlen($txt); $i++) { // 如果 $ctr = $encrypt_key 的長度,則 $ctr 清零 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; // $tmp 字串在末尾增加兩位,其第一位內容為 $encrypt_key 的第 $ctr 位, // 第二位內容為 $txt 的第 $i 位與 $encrypt_key 的 $ctr 位取異或。然後 $ctr = $ctr + 1 $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]); } // 返回結果,結果為 passport_key() 函式返回值的 base64 編碼結果 return base64_encode(passport_key($tmp, $key)); } /** * Passport 解密函式 * * @param string 加密後的字串 * @param string 私有密匙(用於解密和加密) * * @return string 字串經過私有密匙解密後的結果 */ function passport_decrypt($txt, $key) { // $txt 的結果為加密後的字串經過 base64 解碼,然後與私有密匙一起, // 經過 passport_key() 函式處理後的返回值 $txt = passport_key(base64_decode($txt), $key); // 變數初始化 $tmp = ''; // for 迴圈,$i 為從 0 開始,到小於 $txt 字串長度的整數 for ($i = 0; $i < strlen($txt); $i++) { // $tmp 字串在末尾增加一位,其內容為 $txt 的第 $i 位, // 與 $txt 的第 $i + 1 位取異或。然後 $i = $i + 1 $tmp .= $txt[$i] ^ $txt[++$i]; } // 返回 $tmp 的值作為結果 return $tmp; } /** * Passport 密匙處理函式 * * @param string 待加密或待解密的字串 * @param string 私有密匙(用於解密和加密) * * @return string 處理後的密匙 */ function passport_key($txt, $encrypt_key) { // 將 $encrypt_key 賦為 $encrypt_key 經 md5() 後的值 $encrypt_key = md5($encrypt_key); // 變數初始化 $ctr = 0; $tmp = ''; // for 迴圈,$i 為從 0 開始,到小於 $txt 字串長度的整數 for($i = 0; $i < strlen($txt); $i++) { // 如果 $ctr = $encrypt_key 的長度,則 $ctr 清零 $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; // $tmp 字串在末尾增加一位,其內容為 $txt 的第 $i 位, // 與 $encrypt_key 的第 $ctr + 1 位取異或。然後 $ctr = $ctr + 1 $tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; } // 返回 $tmp 的值作為結果 return $tmp; } /** * 測試 */ $ystr = 'i love you'; $k = 'hawk'; $enstr = passport_encrypt($ystr,$k); echo passport_decrypt($enstr,$k);