javascript - Cara mendekripsi data dari hasil operasi enkripsi IE 11 menggunakan AES-GCM
Saya berhasil mengenkripsi beberapa data dengan AES-GCM menggunakan IE 11 di Windows 10 tetapi saya tidak bisa membuat dekripsi bekerja. Contoh kode JS untuk enkripsi:
let plainText = new Uint8Array([1]);
let key;
let keyBuf = window.msCrypto.getRandomValues(new Uint8Array(32));
let iv = window.msCrypto.getRandomValues(new Uint8Array(12));
let additionalData = window.msCrypto.getRandomValues(new Uint8Array(16));
let encResult;
let importOp = window.msCrypto.subtle.importKey('raw',
keyBuf,
{ name: 'AES-GCM' },
false,
['encrypt', 'decrypt']);
importOp.oncomplete = function(e) {
key = e.target.result;
let encryptOp = window.msCrypto.subtle.encrypt({
name: 'AES-GCM',
iv: iv,
tagLength: 128,
additionalData: additionalData
}, key, plainText);
encryptOp.oncomplete = function (e) {
encResult = e.target.result;
};
};
Item yang dihasilkan (encResult) adalah AesGcmEncryptResult, yang memiliki nilai terenkripsi dan tag dalam 2 properti berbeda. Seperti yang saya pahami, saya perlu menggabungkan ini dan melewatkannya sebagai teks sandi untuk mendekripsi, seperti pada:
let cipherText = new Uint8Array(plainText.length + 16); // tagLength / 8
cipherText.set(new Uint8Array(encResult.ciphertext), 0);
cipherText.set(new Uint8Array(encResult.tag), plainText.length);
let decryptOp = window.msCrypto.subtle.decrypt({
name: 'AES-GCM',
iv: iv,
tagLength: 128,
additionalData: additionalData
}, key, cipherText);
Saya kemudian menghubungkan oncomplete dan onerror dan onerror yang dijalankan. Sayangnya, objek Event di IE tidak memberi tahu saya apa-apa, kecuali type="error".
Ada sangat sedikit informasi di web tentang penggunaan AES-GCM di IE 11.
Tolong jangan suruh saya menggunakan browser yang berbeda. Semua ini bekerja dengan baik (tetapi berbeda) dengan Chrome dan Firefox. Saya secara khusus mencoba agar ini bekerja di IE 11.
Apa yang saya lewatkan?
Jawaban #1
Saya menemukan shim ini yang (secara samar) menunjukkan bahwa nilai tag masuk ke dalam objek algoritma dan teks sandi saja masuk ke argumen ketiga. Misalnya.
let decryptOp = window.msCrypto.subtle.decrypt({
name: 'AES-GCM',
iv: iv,
additionalData: additionalData,
tag: new Uint8Array(encResult.tag)
}, key, new Uint8Array(encResult.ciphertext));
Mengapa ini begitu sulit ditemukan? Mengapa tidak ada posting blog tentang fitur ini? Mengapa dokumen MS begitu singkat dalam detail?
