1. 程式人生 > >URL引數對稱加密---PHP語言版本

URL引數對稱加密---PHP語言版本

一. 基礎方法

為了簡單易行,設計上,我將所有引數以json物件封裝起來,然後再進行加密:
1. json封裝物件

 $data = json_encode($data);

2.異或對稱加密(兩種方法,自行選擇)

/**
 * 方法1
 * 直接異或對稱加密
*/
function xor_enc($str,$key){
        $crytxt = '';
        $keylen = strlen($key);
        for($i=0;$i<strlen($str);$i++)
        {
         $k = $i%$keylen;
         $crytxt
.= $str[$i] ^ $key[$k]; } return $crytxt; }
/**
 * 方法2(使用該函式要求祕鑰資料不能具有周期性【如:123123就是不行的】,否則加密可能無效)
 * 異或對稱加密
 * 利用a^b^c = a^(b^c) 
 * 若資料比祕鑰短,則祕鑰超出部分會以資料長度為週期迴圈運算加密
 * 若資料比祕鑰長,則祕鑰週期延長運算加密資料
 * 最終原始資料和加密資料長度一樣長
 */
function xor_enc($data,$key){
    $crytxt = '';

    $dataLen = strlen($data
); $keyLen = strlen($key); $cryCnt = ceil($keyLen/$dataLen); for($x=0; $x<$cryCnt;$x++){ $keySec = substr($key, $dataLen*$x,$dataLen); $keySecLen = strlen($keySec); for($i=0;($x==0&&$i<$dataLen)||($x>0&&$i<$keySecLen);$i++){ $k
= $i%$keySecLen; if($x==0){ $crytxt .= $data[$i] ^ $keySec[$k]; }else{ $crytxt[$i] = $crytxt[$i] ^ $keySec[$k]; } } } return $crytxt; }
  1. 加密後的資料可能不是字串,那就利用特殊方法將資料轉為字串
$data = bin2Str($data); //自定義資料轉字串方法
  1. base64編碼後形成的字串可能也不滿足url編碼,最後還要進行url編碼
$data = urlencode($data);

二. 加密校驗的改進加強

進行上述加密步驟後,的確能把資訊進行加密並且在網際網路上安全流通,但是很容易有個問題,如果密文上的某個字元被篡改,而不影響解析出來的json格式解析流程,並且剛好改變了其中動態變化的資料,這就尷尬了,這程式上是無法識別該資料的正確性的,因此還需要對加密前資料還要進行進一步處理。

如,在原資料的前面或者後面加上32位的CRC校驗碼:

function crcFixEnc($data){
    //此處自由發揮
}
function crcFixDec($data){
    //此處自由發揮
}

//加密前
crcFixEnc($jsondata);

//解密後校驗
$jsondata = crcFixDec($data);