1. 程式人生 > >JS AES加密與PHP解密

JS AES加密與PHP解密

網頁端(在沒有https情況下)給密碼之類的加密傳輸,雖然多此一舉,也好過直接監控軟體就能看到密碼

思路

在傳輸密碼的時候,先向後臺獲取一個隨機碼或者驗證碼,作為祕鑰,網頁端根據這個祕鑰,加密要傳輸的資料,服務端先驗證驗證碼是否正確,如果驗證正確,根據驗證碼進行資料解密
fox.風

PHP

class AesJs
{
    /**向量
     * @var string
     */
    private static $iv = "1234567890123412";//16位
    /**
     * 預設祕鑰
     */
    const KEY = '1111111111111123'
;//16位 public static function init($iv = '') { self::$iv = $iv; } /** * 加密字串 * @param string $data 字串 * @param string $key 加密key * @return string */ public static function encrypt($data = '', $key = self::KEY) { $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key
, $data, MCRYPT_MODE_CBC, self::$iv); return base64_encode($encrypted); } /** * 解密字串 * @param string $data 字串 * @param string $key 加密key * @return string */ public static function decrypt($data = '', $key = self::KEY) { $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key
, base64_decode($data), MCRYPT_MODE_CBC, self::$iv); return rtrim($decrypted, "\0"); } } //呼叫 //加密 AesJs::encrypt('要加密的字串','祕鑰'); //解密 AesJs::decrypt('要解密的字串','祕鑰');

JS

<script src="crypto-js/rollups/aes.js" type="text/javascript"></script>
<script src="crypto-js/rollups/md5.js" type="text/javascript"></script>
<script src="crypto-js/components/pad-zeropadding-min.js" type="text/javascript"></script>
/**
 * 加密
 */
function encrypt(str,key) {
    key = CryptoJS.enc.Utf8.parse(key?key:"1111111111111111");// 祕鑰
    var iv= CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
    var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
    return encrypted.toString();
}
/**
 * 解密
 * @param str
 */
function decrypt(str) {
    var key = CryptoJS.enc.Utf8.parse("1111111111111111");// 祕鑰
    var iv=    CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
    var decrypted = CryptoJS.AES.decrypt(str,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
    return decrypted.toString(CryptoJS.enc.Utf8);
}
//呼叫
//加密
console.log(encrypt("12345"));
//解密
console.log(decrypt("待解密字元"));

實際使用

JS

//加密部分要改造一下
/**
 * 加密
 */
function encrypt(str,key) {
    key = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(key).toString());//祕鑰
    var iv= CryptoJS.enc.Utf8.parse('1234567890123412');//向量iv
    var encrypted = CryptoJS.AES.encrypt(str, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.ZeroPadding });
    return encrypted.toString();
}
//驗證碼 轉換成大寫
var username=$('#username').val();//獲取使用者名稱
var pwd=$('#pwd').val();//獲取密碼
var verify=$('#verify').val();//獲取驗證碼
verify = verify.toUpperCase();
var json = {username: username, pwd: pwd};//被加密的資料
var aes = encrypt(JSON.stringify(json), verify);//加密
var param = {verify: verify, param: aes};
$.post("/user/login?_=" + new Date().getTime(), param, function (data) {
    if (data) {
    ...
    } else {
    ....
    }
}, "json");

PHP

$verify=input('verify');//驗證碼
$param=input('param');//加密後資料
//先轉換成大寫
//然後MD5
$json=AesJs::decrypt($param,md5(strtoupper($verify)));
echo $json;
$arr=json_decode($json,true);
print_r($arr);