1. 程式人生 > >JS實現AES加密並與PHP互通

JS實現AES加密並與PHP互通

有關資料加密解密問題,有很多鍾加密方式;

這裡我講述下js和php實現AES互通

js加密:

首先引入這幾個js檔案

<script type="text/javascript" src="/CryptoJS/aes.js"></script>
<script type="text/javascript" src="/CryptoJS/pad-zeropadding.js"></script>

 <script type="text/javascript">

var data="test";//加密字串

var key  = CryptoJS.enc.Latin1.parse('@12345678912345!');//金鑰
var iv   = CryptoJS.enc.Latin1.parse('@12345678912345!');//與金鑰保持一致
    //加密
    var data = JSON.stringify(data);//將資料物件轉換為json字串
    var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
    encrypted=encodeURIComponent(encrypted);
    document.write(decrypted);//輸出加密後的字串


    //解密

var data="加密的字串";

//key和iv和加密的時候一致

 var decrypted = CryptoJS.AES.decrypt(data,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
 decrypted=decrypted.toString(CryptoJS.enc.Utf8);
 document.write(decrypted);//輸出解密後的資料
    </script>

在實際用的時候和php傳輸中,js加密後的字串裡面的+被瀏覽器解析成了空格  然後php解密的時候出錯;這裡可以對加密之後的字串做進一步處理encrypted=encodeURIComponent(encrypted);就沒有這個問題了

PHP的加密解密方法:

$privateKey="@12345678912345!";
$iv="@12345678912345!";
         //加密
$encrypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$privateKey,$data,MCRYPT_MODE_CBC,$iv);
echo  base64_encode($encrypted);
 

//解密
$encryptedData=base64_decode($data);
$decrypted=mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$privateKey,$encryptedData,MCRYPT_MODE_CBC,$iv);
$decrypted=rtrim($decrypted,"\0");//解密出來的資料後面會出現如圖所示的六個紅點;這句程式碼可以處理掉,從而不影響進一步的資料操作

return $decrypted;
 

這裡需要注意的就是紅色標註的地方。