必须先确定js与php两边的加密模式、秘钥,否则不能相互解开。
php加密:
function encrypt($data='hello,axl'){
$screct_key = '1234567899876543';//必须是16、24、32位
$str = $screct_key;
$iv =mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC),MCRYPT_RAND);
$encrypt_str = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $screct_key);//这一步确定机密模式为128位cbc模式MCRYPT_RIJNDAEL_128,MCRYPT_MODE_CBC;
return base64_encode($encrypt_str);//可不用base64_encode,不用$encrypt_str为乱码,但是解密过后不影响。如果需要查看最好使用base64
}
php解密:
function decrypt($str){
$screct_key = '1234567899876543';
$str = base64_decode($str);
$iv = $screct_key ;
$encrypt_str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $screct_key, $str, MCRYPT_MODE_CBC, $screct_key);
$encrypt_str = trim($encrypt_str);
return $encrypt_str;
}
js加密:
//需要的js文件
<script src="./rollups/aes.js"></script>;
<script src="./components/pad-zeropadding.js"></script>;
加密
function jsencrypt(str){
var key='1234567899876543';
var iv=key;
var mi=CryptoJS.AES.encrypt(str,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
return result;
}
解密
function jsdecrypt(str){
var key='1234567899876543';
var iv=key;
var result=CryptoJS.AES.decrypt(str,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding}).toString(CryptoJS.enc.Utf8);//确定解密编码CryptoJS.enc.Utf8,必须与php编码一直不然乱码
return result;
}
使用jquery传值发现不能对数组加密只能单个加密。且连接时需要加引号。
function userLogin(name,pass){
var name=jsencrypt(name);
var pass=jsencrypt(pass);
$.ajax({
type:"POST",
url:"./login",
data: {"name":"'"+name+"'","pass":"'"+pass+"'"},//此处需用引号将加密后的东西括起来,否则会报Uncaught RangeError: Maximum call stack size exceeded,不知道是我js的问题还是我的aes包的问题,推断应该是jquery文件问题。
success:function(msg){
alert(msg);
},
error: function() {
alert('error);
},
})
}