来自mcrypt的Crypto-Js不同输出在更改数据时加密

时间:2014-06-24 18:31:36

标签: javascript php encryption

我现在的问题与这个Crypto-Js different output from mcrypt有关,这就是为什么我使用相同的问题但添加了一些额外的行来更好地解释它。

基于我之前的问题,这是由SIr Jim解决的(非常感谢您的提示)。它工作部分正确,因为它确实显示相同的结果,但只有当我使用“Blader'如果我使用另一个词,如“CROW'然后两个脚本之间的输出是不同的。

这里是由jim爵士提供的代码,其功能类似魅力 (我在这里使用过Blader)

$encrypted = "Blader\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);

示例是当我使用 CROW 作为要加密的数据时

加密中的输出

dxt3uyk27U3wRRrzaFGiwQ==

以mcrypt输出

x9/oeyLZkLkXM7B1Zo+ezg==

为了解决这个问题,我删除了cryptoJS中的padding: CryptoJS.pad.Pkcs7,但我的问题是,如果我不想删除cryptoJS中的填充,该怎么办?

非常感谢所有答案。

1 个答案:

答案 0 :(得分:0)

您需要了解PKCS#7 padding的工作原理。它将明文带到16个字节的倍数。如果已经是16的倍数,则会额外增加16个字节。

对于UTF-8中的“CROW”(四个字节),您将添加12个字节。每个字节现在为12,即12个12字节,而不是Blader的10个10字节。例如,试试这个:

$encrypted = "CROW\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c";

要使用PKCS#7填充,您可以尝试这样的事情:

$encrypted = "CROW";

// Add PKCS#7 padding
$pad = 16 - (strlen($encrypted) % 16);
$encrypted = $encrypted . str_repeat(chr($pad), $pad);

(我会将变量命名为$ encrypted以外的变量,因为它实际上从未保存加密数据。)