来自mcrypt的Crypto-Js输出不同

时间:2014-06-24 14:03:13

标签: javascript php encryption

我有一个js脚本加密'Blader'数据。如果我加密它,它返回

的输出

JS-SCRIPT结果

uqnOrevjCc2YCvY3uKNjzA==

现在,作为比较基础的答案,我写了或者更确切地说在PHP中搜索了与我的JS脚本类似的等效脚本。令我感到困惑的是,逻辑是正确的和正确的,但答案是不同的。在我使用mcrypt的php脚本上,我将这个结果放在

mcrypt RESULT

HzfWFNKcAmkO6zJEYjbG4Q==

如果你注意到,长度是相同的,这意味着我所做的代码的逻辑/修改是正确的。现在正如我之前所说,我在这里复制了一些帖子的脚本。

这是我认为使用加密JS的JS脚本

function crypto_encrypt(text) {                                                                        //This is for JS
var keyBase64 = CryptoJS.enc.Base64.parse("ITU2NjNhI0tOc2FmZExOTQ==");
var iv = CryptoJS.enc.Base64.parse('AAAAAAAAAAAAAAAAAAAAAA==');

var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(text), keyBase64,
    {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
        //padding: CryptoJS.pad.ZeroPadding
    });

// Returns a Base64 encoded string.
return encrypted;
}

以下是我在mcrypt / mycrypt中找到的代码

<?php
$encrypted = "Blader";
$iv        = "0000000000000000";   // iv_base64 from JS
$key       = hexdec("213536363361234b4e736166644c4e4d");  // key_base64 from JS
$plaintext = mcrypt_decrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv );
echo base64_encode($plaintext);
?>

现在的问题是,我尝试从UTF8_encode到所有base64_encode和解码,但仍然找不到什么是错的,我很好,这是可以实现的,因为我注意到JS-Script中的IV不同于我在mcryp(PHP)中试图回应它。任何建议,意见和建议都将受到高度赞赏。

和平了。

1 个答案:

答案 0 :(得分:0)

首先,您必须使用PHP中的相同的密钥和IV ,就像在CryptoJS中一样,或者它只是不起作用。你比较了钥匙和IV的价值吗?他们不匹配。

其次,你必须在每一侧使用相同的填充。你有没看过MCrypt怎么垫?它使用零填充。你的两个明文不同,因为填充是明文的一部分。

最后,您不想在这里使用mcrypt_ 加密而不是mcrypt_decrypt吗?

如果您匹配密钥和IV,填充,并在PHP中加密,您将得到相同的结果(我用\ x0a - 10手动填充 - 以匹配您的PKCS# 7填充):

$encrypted = "Blader\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a\x0a";
$iv = base64_decode('AAAAAAAAAAAAAAAAAAAAAA==');
$key = base64_decode('ITU2NjNhI0tOc2FmZExOTQ==');
$plaintext = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv );
echo base64_encode($plaintext);

uqnOrevjCc2YCvY3uKNjzA==