需要javascript中的AES解密

时间:2018-12-11 11:09:44

标签: javascript java angular encryption cryptojs

我在Java中有以下用于解密的代码,我希望在angular4中实现。

public synchronized InputStream getInputStream(String src) {
    KeyEntry entry = keysMap.get(src);
    try {
        String destPath = rootFolder + "/" + entry.destination;
        FileInputStream is = new FileInputStream(destPath);
        if (entry.key.isEmpty()) return is;
        byte[] encKey = Base64.decode(entry.key, Base64.DEFAULT);
        SecretKeySpec secretKeySpec = new SecretKeySpec(encKey, AES_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(encKey);
        Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        return new CipherInputStream(is, cipher);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

当前正在执行此操作,如下所示,但不起作用

decryptContent(ciphertext, base64Key) {
    const key = CryptoJS.enc.Base64.parse(base64Key);

    const decryptedData = CryptoJS.AES.decrypt( ciphertext, key, {
        iv: CryptoJS.lib.WordArray.random(128 / 8),
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.NoPadding
    });

    const decryptedText = decryptedData.toString( CryptoJS.enc.Utf8 );    
}

1 个答案:

答案 0 :(得分:1)

  

AES_TRANSFORMATION =“ AES / CFB8 / NoPadding”;

然后,您还需要使用CFB模式进行解密

 mode: CryptoJS.mode.CFB
  

我不明白如何像Java中那样在javascript中获得IV,这是我最常受到打击的地方

IvParameterSpec ivParameterSpec = new IvParameterSpec(encKey);

在Java中,加密密钥也用作IV。要解密数据,您也应该将密钥用作IV。

请注意,使用密钥作为IV是不好的做法,并且可能会造成安全漏洞。 IV允许对多个加密重用相同的密钥,而无需为“两次填充攻击”创造机会。如果密钥被重复用于多种加密,则对于同一密钥的每种加密,IV必须是唯一的。