【问题标题】:Crypto-Js different output from mcryptCrypto-Js 来自 mcrypt 的不同输出
【发布时间】:2014-08-14 20:04:21
【问题描述】:

我有一个 js 脚本来加密“Blader”数据。如果我对其进行加密,它会返回

的输出

JS 脚本结果

uqnOrevjCc2YCvY3uKNjzA==

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

中得到了这个结果

mcrypt 结果

HzfWFNKcAmkO6zJEYjbG4Q==

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

这是我认为使用 crypto-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 不同于IV 在 mcryp(PHP) 中我试图回应它的一切。任何建议、cmets 和建议将不胜感激。

和平相处。

【问题讨论】:

  • 过去我曾尝试在网页中实现某些散列和加密功能。我了解到,网页客户端上的任何加密功能都是有益的用例很少。请问你的目的是什么?
  • 我们将尝试检查是否可以使用自己的 php 函数复制 Javascript 函数。我想在编码功能方面更加灵活,所以我想通过在 php 中使用 mcrypt 来重现 cryptoJS 的功能。顺便谢谢你的回答。
  • 根据 mcrypt_decrypt php 文档页面上的this comment,AES 和 Rijndael 在不同的实现中表现不同。
  • 所以据我了解,这两个产生的输出永远不会相似?我说的对吗?
  • 我不太擅长阅读加密语言,但类似问题中的this answer 可能会提供一些额外信息。

标签: javascript php encryption


【解决方案1】:

首先,您必须在 PHP 中使用与在 CryptoJS 中完全相同的 相同的密钥和 IV,否则它将无法正常工作。您是否比较了键和 IV 的值?它们不匹配。

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

最后,你不想在这里使用 mcrypt_encrypt 而不是 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==

【讨论】:

猜你喜欢
  • 2014-08-15
  • 2014-01-29
  • 1970-01-01
  • 2014-09-12
  • 2015-06-17
  • 2021-08-09
  • 2012-08-24
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多