今天做了一個功能,需要js傳密碼到php文件,對js密碼 進行判斷,為想為這個傳輸過程進行解密,參考了網上的一個方法(這個方法我只是使用了,並沒有太深了解0.0)
首先要引入3個js文件 (在網上可搜索到)
<script src="../public/js/aes.js"></script>
<script src="../public/js/md5.js"></script>
<script src="../public/js/pad-zeropadding.js"></script>
然后 附上我使用時的代碼
var data= "132465";//需要加密的數據
var key = CryptoJS.enc.Utf8.parse('1a1a1a1b1e1c1s12');
var iv = CryptoJS.enc.Utf8.parse('1111111111111111');
//上面2個參數'lalal...','111...'自己定義,但是跟php文件中的參數要相同(長度為16位,其他位數暫未嘗試)
var encrypted = CryptoJS.AES.encrypt(data, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
var msg = encrypted.toString();//結果為加密后的字符串
接下來是php文件
$pass = str_replace(' ','+',$pass);
//第一個坑,上面之所以要把字符串中的空格給替換為'+',不替換下面解碼會出錯!!!
(這個是解決掉下面的坑后再測試時發現,有些加密解密會成功,有些會失敗,把加密后的字符串獨立拿出來時才發現這個問題)
$privateKey = "1a1a1a1b1e1c1s12";
$iv = "1111111111111111";
//上面2個要跟前面js文件的key和vi相同
$encryptedData = base64_decode($pass);
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);
$decrypted =trim($decrypted);
第二個坑,上2步結束后,如果不用trim方法,打印var_dump($decrypted),會輸出加密前的值,但是!!!后面緊跟着一堆亂碼!
我查看源代碼發現,這些是 '�' 這個字符我一臉懵逼,搞了好多方法都沒去掉(果然菜雞),后來試了trim這個函數,馬上就沒了這些
亂碼(好氣!),就完全獲得到js加密前的密碼了(好像很簡單的樣子)。。。。特地寫了這篇文章來紀念我逝去的下午。
tips:我都是用字母數字下划線測試的,漢子和特殊字符暫未測試!