URL引數對稱加密---PHP語言版本
阿新 • • 發佈:2019-02-07
一. 基礎方法
為了簡單易行,設計上,我將所有引數以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;
}
- 加密後的資料可能不是字串,那就利用特殊方法將資料轉為字串
$data = bin2Str($data); //自定義資料轉字串方法
- base64編碼後形成的字串可能也不滿足url編碼,最後還要進行url編碼
$data = urlencode($data);
二. 加密校驗的改進加強
進行上述加密步驟後,的確能把資訊進行加密並且在網際網路上安全流通,但是很容易有個問題,如果密文上的某個字元被篡改,而不影響解析出來的json格式解析流程,並且剛好改變了其中動態變化的資料,這就尷尬了,這程式上是無法識別該資料的正確性的,因此還需要對加密前資料還要進行進一步處理。
如,在原資料的前面或者後面加上32位的CRC校驗碼:
function crcFixEnc($data){
//此處自由發揮
}
function crcFixDec($data){
//此處自由發揮
}
//加密前
crcFixEnc($jsondata);
//解密後校驗
$jsondata = crcFixDec($data);