crypto-js错误的des-ecb解码

时间:2020-02-17 09:02:06

标签: javascript algorithm cryptography cryptojs des

我需要使用带有ECB模式的base64密钥和使用DES的Iso10126填充来解密base64字符串。

理论上很简单:

const decryptedKeyDes = CryptoJS.DES.decrypt(
      encryptedData, // QAKH7qnKxZTIta...
      ResponseParser.secretKey, // MfKhm... length=32
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Iso10126
      }
    );

我得到sigBytes:162的响应,并将其转换为base64之后(因为我需要ungzip),我得到了 byteLength:243这是错误的,应该是byteLength:395(我只是在编译它)加上我正确的Java代码)。

我不知道这是怎么回事。

我也尝试使用node.js的crypto来做到这一点,但是我也得到了错误和不同的结果。我找不到在padding中设置crypto的方法,我只能得到utf8binaryascii

function encodeDesECB(textToEncode, keyString) {
      var key = new Buffer(
        "some key with 32 length".substring(0, 8),
        "utf8"
      );
      var cipher = crypto.createDecipheriv("des-ecb", key, null);
      cipher.setAutoPadding(false);
      var c = cipher.update(textToEncode, "base64", "utf8");

      c += cipher.final("utf8");
      return c;
    }

java代码是:

import javax.crypto.Cipher
import static javax.crypto.Cipher.DECRYPT_MODE

//CIPHER_ALGORITHM_MODE_PADDING = 'DESede/ECB/ISO10126Padding'

Cipher decryptingCipher = Cipher.getInstance(CIPHER_ALGORITHM_MODE_PADDING)
      decryptingCipher.init(DECRYPT_MODE, secretKeySpec)
      decryptingCipher.doFinal(data)

其中secretKeySpec是带有algorithm: DESedekey的对象,bit[]等于我的对象。

我不知道我的代码有什么问题。

CryptoJs是否工作不正确,或者我忘记了解码中的某些内容。

您有什么线索可能会出错吗?

1 个答案:

答案 0 :(得分:0)

感谢@Topaco,我终于解决了它。

密钥必须为WordArrayCryptoJS.enc.Base64.parse('some key with 32 length')

该消息必须为base64字符串:QAKH7qnKxZTIta...;

然后,您需要像下面这样解析响应:tripleDesResult.toString(CryptoJS.enc.Base64)

再次感谢!