我在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 );
}
答案 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必须是唯一的。