Javascript Crypto Js与mcrypt的不同输出

Javascript Crypto Js与mcrypt的不同输出,javascript,php,encryption,Javascript,Php,Encryption,我有一个js脚本,它加密的数据是“Blader”。如果我加密它,它将返回 JS-SCRIPT结果 uqnOrevjCc2YCvY3uKNjzA== HzfWFNKcAmkO6zJEYjbG4Q== 现在,将这个答案作为比较的基础,我编写了或者说搜索了一个与我的JS脚本类似的PHP脚本。让我困惑的是,逻辑是正确的,但答案是不同的。在使用mcrypt的php脚本中,我得到了这个结果 mcrypt结果 uqnOrevjCc2YCvY3uKNjzA== HzfWFNKcAmkO6zJEYjbG4Q

我有一个js脚本,它加密的数据是“Blader”。如果我加密它,它将返回

JS-SCRIPT结果

uqnOrevjCc2YCvY3uKNjzA==
HzfWFNKcAmkO6zJEYjbG4Q==
现在,将这个答案作为比较的基础,我编写了或者说搜索了一个与我的JS脚本类似的PHP脚本。让我困惑的是,逻辑是正确的,但答案是不同的。在使用mcrypt的php脚本中,我得到了这个结果

mcrypt结果

uqnOrevjCc2YCvY3uKNjzA==
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_编码到所有base64_编码和解码,但仍然找不到问题所在,我很好奇这是不是可以实现的,因为我注意到JS脚本中的IV与mcryp(PHP)中的IV不同,我尝试回显它的所有内容。我们将高度感谢您的任何建议、意见和建议


平静下来。

首先,您必须在PHP中使用与在CryptoJS中完全相同的密钥和IV
,否则它将无法工作。你比较过钥匙和IV的值吗?他们不匹配

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

最后,您不想在这里使用mcrypt_uu加密而不是mcrypt_u解密吗

如果在PHP中匹配key和IV,以及padding和encrypt,则会得到相同的结果(我已经手动使用\x0a--10--来匹配PKCS#7 padding):


在过去,我曾尝试在网页中实现某些哈希和加密功能。我所了解到的是,网页客户端的任何加密功能都是有益的,这种情况非常少。请问你的目的是什么?我只是想看看我是否可以用自己的php函数复制Javascript函数。我希望在编写函数时更加灵活,所以我希望通过在php中使用mcrypt重现cryptoJS的功能。顺便说一句,谢谢你的回答。根据mcrypt_decrypt php doc页面上的信息,AES和Rijndael在不同的实现中的行为并不相同。所以据我所知,这两种方法产生的输出永远不会相似?我说的对吗?我不太擅长阅读crypto speak,但类似的问题可能会提供一些额外的信息。嗨,先生。谢谢它工作正常,但有一个小错误。它只适用于
Blader
。如果我想使用CROW,或者假设一个名称示例是
Patrick
,该怎么办。它发出不同的输出。我的下一个问题是这样的