【问题标题】:Encrypting with PHP; decrypting with CryptoJS用 PHP 加密;用 CryptoJS 解密
【发布时间】:2015-08-27 04:25:58
【问题描述】:

我在使用用 PHP 加密的 CryptoJS 解密数据时遇到了一些问题。也许有人可以告诉我我哪里出错了?

我加密如下:

  1. 获取哈希密码
  2. 以(0,16)的子串为key
  3. 加密 (MCRYPT_RIJNDAEL_128)
  4. 将密文编码为base64

解密时我也会这样做:

  1. 获取哈希密码
  2. 以(0,16)的子串为key
  3. Base64 解码密文
  4. 解密

PHP:

public function encrypt($input, $key) {
    $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    $input = $this->_pkcs5_pad($input, $size);
    $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
    $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, $key, $iv);
    $data = mcrypt_generic($td, $input);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    $data = base64_encode($data);
    return $data;
}

JavaScript:

function decrypt(ciphertext, hashedPsw) {
        var key =  hashedPsw.substring(0, 16);

        var key = CryptoJS.enc.Hex.parse(key);

        var options = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, keySize:128 / 32 };

        ciphertext = CryptoJS.enc.Base64.parse(ciphertext);
        var decrypted = CryptoJS.AES.decrypt(ciphertext, key);
        return decrypted;
    }

【问题讨论】:

  • 只是出于好奇,您是同时使用https 还是仅使用这种方法?
  • 是的,我也在使用 https :)
  • 我对加密有点陌生,也许这就是为什么我不明白为什么你需要两者?如果您使用https,那么您的所有数据在离开浏览器或服务器之前都会被加密。也就是说,“电线”上没有明文
  • 我在之前的帖子中找到了解决方案:[这里][1]。 [1]:stackoverflow.com/questions/24337317/…

标签: javascript php cryptography cryptojs


【解决方案1】:

CryptoJS decrypt 函数需要一个包含 WordArray 而不是 WordArray 本身的对象,因此您需要使用:

var decrypted = CryptoJS.AES.decrypt({ ciphertext: ciphertext }, key, options);

您还需要将选项传递给decrypt 函数。否则,CryptoJS 不会知道你想使用 ECB 模式。


安全

不要使用 ECB 模式!它在语义上不安全。您至少应该使用随机 IV 的 CBC 模式。 IV 不需要保密,因此您可以简单地将其添加到密文中。

然后你应该验证你的密文。这可以通过 GCM 或 EAX 等经过身份验证的模式来完成,但它们不是由 mcrypt 或 CryptoJS 提供的。下一个最好的方法是使用先加密后 MAC 方案,您可以在密文上使用 HMAC-SHA256 等强密钥散列函数,以使攻击者无法在您不知情的情况下更改密文。

【讨论】:

  • 如果这不能解决您的问题,您应该提供一个完整的加密-解密周期作为带有示例数据和密钥的代码。
  • 感谢您的回答和信息。我已经添加了选项(但忘记在此处的代码中显示)。不幸的是,我仍然遇到问题。我现在得到:TypeError: Cannot read property '0' of undefined at Object.CryptoJS.lib.Cipher.x (aes.js:26)
  • 现在您有 4 个新错误:第一个是 EBC 拼写错误。现在,花点时间看看你是如何编码的,看看它是否在 php 和 js 之间匹配。
  • Uups - 修复了 ECB,修复了 iv base64 编码,修复了 UTF-8 字符串化...并从 PHP 代码中删除了 pks5 填充(PKSC7 显然是默认值)...但是问题持续...
  • 再一次,您还没有显示完整的代码 (HTML)。您是否包含了 CryptoJS 的 ECB 组件?因为默认情况下它不包含在 AES 汇总中。如果您还没有,只需切换到 CBC 模式,因为您拥有这一切所需的一切。
【解决方案2】:

我刚刚发现答案in a previous thread:原来问题出在密钥编码上。

【讨论】:

  • 这个答案完全没有帮助。实际问题是什么? PHP 中使用了哪种编码,CryptoJS 中使用了哪种编码?您需要将这些详细信息添加到问题中,以便此答案有意义。但是,这个问题与它开始时不应该发生的问题完全不同。我回滚了您的问题,因为如果已经有答案,则不应更改该问题。您可以提供您最终在此答案中使用的代码。
猜你喜欢
  • 2015-06-13
  • 2015-10-17
  • 1970-01-01
  • 2014-08-17
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多