PHP加密和CryptoJS解密

时间:2015-12-07 01:49:02

标签: javascript php encryption cryptojs

解密(使用CryptoJs)我的PHP加密数据时遇到问题。 这是我的PHP加密:

function encrypt($pure_string, $encryption_key, $iv) {
    $encrypted_string = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryption_key, utf8_encode($pure_string), MCRYPT_MODE_CBC, $iv);
    return $encrypted_string;
}

function cripto()
{
    $crypto_key = "230e8cb8c43d532f389ff0e2b5337919";
    $data_to_encrypt = "Data to encrypt";

    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

    $ciphertext = $this->encrypt($data_to_encrypt, $crypto_key, $iv);
    return array("iv" => pack('H*', $iv), "chipertext" => base64_encode($ciphertext),"key" => $crypto_key);

}

这是我的JavaScript代码(php crypto函数的结果存储在加密变量中):

var ciphertext = <?php echo '"'.$encrypted["ciphertext"].'"'; ?>;
var iv = <?php echo '"'.$encrypted["iv"].'"'; ?>;
var crypto_key = <?php echo '"'.$encrypted["key"].'"'; ?>;

iv = CryptoJS.enc.Hex.parse(iv);
ciphertext = CryptoJS.enc.Base64.parse(ciphertext);

var decrypted = CryptoJS.AES.decrypt(ciphertext, crypto_key,{ iv: iv });
console.log(decrypted.toString(CryptoJS.enc.Utf8));

我的解密值总是一个空字符串,我无法弄清楚原因。

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  • PHP使用零填充(填充0-15字节的0x00),但CryptoJS默认使用PKCS#7填充。那些是不相容的。
  • CryptoJS'decrypt()函数需要一个CipherParams对象,您可以通过传递具有ciphertext属性集的对象来简单地模拟它。

合:

iv = CryptoJS.enc.Hex.parse(iv);
ciphertext = CryptoJS.enc.Base64.parse(ciphertext);

var decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, crypto_key, {
    iv: iv,
    padding: CryptoJS.pad.ZeroPadding
});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

不要忘记包含pad-zeropadding-min.js

请记住,JavaScript加密有problems for justification。你真的应该使用SSL,因为没有SSL,这只是混淆(密钥与密文一起发送)。

最好是PKCS#7 padding in PHP并保留CryptoJS中的默认值。