我正在用Java加密文件,需要在客戶端解密它。 這是服務器端代碼:CryptoJS解密(AES)來自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。尚未成爲真實的代碼。 – Sandeep
不要使用字符串作爲鍵,使用字節數組。從字符串到字節數組的轉換是不明確的(BoM在開始?\ 0終止符?等等)。特別是當在系統之間傳輸加密數據時,不會**依賴於系統默認值。顯式設置模式,IV/Nonce等等。你在這方面做得很少,並且依靠系統中的默認設置是相同的。任何不匹配的默認值都會導致問題。 – rossum