用PHP加密;用CryptoJS解密

时间:2015-06-11 12:54:41

标签: javascript php cryptography cryptojs

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

我正在加密如下:

  1. 获取哈希密码
  2. 将(0,16)的子字符串作为键
  3. 加密(MCRYPT_RIJNDAEL_128)
  4. 将密文编码为base64
  5. 解密时我也这样做:

    1. 获取哈希密码
    2. 将(0,16)的子字符串作为键
    3. Base64解码密文
    4. 解密
    5. 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;
          }
      

2 个答案:

答案 0 :(得分:4)

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),使攻击者在不知情的情况下更改密文是不可行的。

答案 1 :(得分:0)

我刚刚发现答案in a previous thread:原来问题是关键编码。