【发布时间】:2016-04-25 11:27:53
【问题描述】:
我正在用 Java 加密文件,需要在客户端对其进行解密。 这是服务器端代码:
Key secretKey = new SecretKeySpec("mysecretmysecret".getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] outputBytes = cipher.doFinal(read(sampleFile));
return outputBytes;
在客户端,我使用 Ajax 请求来获取文件并使用 CryptoJS AES:
var xhr = new XMLHttpRequest();
xhr.open('GET', 'file', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function (e) {
var encryptedData = this.response;
var decrypted = CryptoJS.AES.decrypt(encryptedData, "mysecretmysecret");
console.log(decrypted);
};
xhr.send();
但这不会解密文件。我将此打印为控制台中的解密值:
W…y.init {words: Array[0], sigBytes: 0}
我也尝试将 arraybuffer 转换为 WordArray 建议 here 但仍然是相同的结果。 如果有人能指出我正确的方向并告诉我我做错了什么,我会非常高兴。
编辑 1: 我已经解决了这个问题。我使用的代码作为答案发布。
【问题讨论】:
-
"mysecretmysecret" 如果它位于客户端源代码中,它可能不是那个秘密。
-
@AlexK。这只是一个 POC。还没有进入真正的代码。
-
不要使用字符串作为键,使用字节数组。从字符串到字节数组的转换是不明确的(BoM 开头?\0 终止符?等等)尤其是在系统之间传输加密数据时,不依赖系统默认值。显式设置模式、IV/Nonce 等。您对此几乎没有做任何事情,并且依赖默认值在系统之间保持相同。任何不匹配的默认值都会导致问题。
-
@rossum 在 CryptoJS(至少 Angular 6)中使用字节数组是一场噩梦。你有工作样本吗?
-
@afe 我帮不上什么忙,因为我不使用 CryptoJS 或 Angular。也许专门为他们询问一个小组?
标签: java encryption cryptography aes cryptojs