我使用来自Brain Foo Long的example code与CryptoJS和php 5.5.12合作。
我使用以下代码加密客户端:
var msg = 'String to crypt';
var key = 'password';
var crypt_text = CryptoJS.AES.encrypt(JSON.stringify(msg), key, {format: CryptoJSAesJson}).toString();
sendString = "msg=" + crypt_text +"&key=" + k ;
//... call jQuery.ajax
我使用以下代码解密服务器端:
function cryptoJsAesDecrypt($passphrase, $jsonString){
$jsondata = json_decode($jsonString, true);
try {
$salt = hex2bin($jsondata["s"]);
$iv = hex2bin($jsondata["iv"]);
} catch(Exception $e) { return null; }
$ct = base64_decode($jsondata["ct"]);
$concatedPassphrase = $passphrase.$salt;
$md5 = array();
$md5[0] = md5($concatedPassphrase, true);
$result = $md5[0];
for ($i = 1; $i < 3; $i++) {
$md5[$i] = md5($md5[$i - 1].$concatedPassphrase, true);
$result .= $md5[$i];
}
$key = substr($result, 0, 32);
$data = openssl_decrypt($ct, 'aes-256-cbc', $key, true, $iv);
return json_decode($data, true);
}
随机地,服务器代码openssl_decrypt
返回false。
通常情况下,我看到$ct = base64_decode($jsondata["ct"]);
错误地输入&#34; base64在字母表外面#34;但我尝试在发送之前检查js,看起来是正确的。代码如下:
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij ............" };
var sendString = "msg=" + crypt_text +"&key=" + k ;
if( Base64.decode( Base64.encode(sendString) )=== sendString ){
// ok
} else {
alert('base 64 error');
return;
}