【php】數據加密與解密


最近突發奇想,想實現一個小功能,(具體的保密,呵呵~)
其中一段我想用 數據加密來實現,但是這個並不是像md5那樣單xiang的,因為我只是想在傳輸過程中 加密,而傳輸到了后再進行 解密。而且我並不想在服務器端裝什么組件。所以就...........研究.............了一下,沒有結果。
哈哈,就問了一下haohappy這個php高手。
結果得到了如下函數:
base64_encode()
base64_decode()
實驗了一下,挺符合我的要求的,有空再給他加個私鑰,就很完美了~~~
其實,以前在研究php發信的時候就有碰到過這個函數,PHPsocket發信的title部分當出現中文的時候,就是用base64_encode來解決亂碼的問題的。呵呵。
順便列一下haohappy提供的另外幾個函數,(雖然不符合我的要求)
rawurldecode -- 對已編碼的 URL 字符串進行解碼
rawurlencode -- 按照 RFC 1738 對 URL 進行編碼
urldecode -- 解碼已編碼的 URL 字符串
urlencode -- 編碼 URL 字符串
BTW:在剛才調試的工程中,感覺似乎迅雷的下載地址也是base64加密的,很you可能。有空研究一下看看。。:)
BTW2:再仔細看了一下,想起來以前有個東東提供帶密鑰的base64來着,仔細baidu了一下下,發現原來是這里
代碼如下:
<?
        /**
        * Passport 加密函數
        *
        * @param                string          等待加密的原字串
        * @param                string          私有密匙(用於解密和加密)
        *
        * @return       string          原字串經過私有密匙加密后的結果
        */
        function passport_encrypt($txt, $key) {

                // 使用隨機數發生器產生 0~32000 的值並 MD5()
                srand((double)microtime() * 1000000);
                $encrypt_key = md5(rand(0, 32000));

                // 變量初始化
                $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;

        }

        /**
        * Passport 信息(數組)編碼函數
        *
        * @param                array           待編碼的數組
        *
        * @return       string          數組經編碼后的字串
        */
        function passport_encode($array) {

                // 數組變量初始化
                $arrayenc = array();

                // 遍歷數組 $array,其中 $key 為當前元素的下標,$val 為其對應的值
                foreach($array as $key => $val) {
                        // $arrayenc 數組增加一個元素,其內容為 "$key=經過 urlencode() 后的 $val 值"
                        $arrayenc[] = $key.'='.urlencode($val);
                }

                // 返回以 "&" 連接的 $arrayenc 的值(implode),例如 $arrayenc = array('aa', 'bb', 'cc', 'dd'),
                // 則 implode('&', $arrayenc) 后的結果為 ”aa&bb&cc&dd"
                return implode('&', $arrayenc);

        }
?>
這段代碼 非常神奇支持私鑰,可以 加密的同時還能做到 解密,而且他的 加密結果居然 唯一的。
例如:
數據:iloveu
鑰匙:really?
加密結果: CzcIMAA5WHEEYFl8
           BzsDO1JrXHUEYFN2
           Az8FPVVsDCVSNlVw
           BjoAOFJrCyJRNQQh
          CjYJMVBpDyZQNFh9
          ................
強烈推薦~~~~~~~~~~~~~~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM