javascript - Ako dešifrovať údaje z výsledku šifrovacej operácie IE 11 pomocou AES-GCM


Podarilo sa mi zašifrovať niektoré údaje pomocou AES-GCM v IE 11 na Windows 10, ale dešifrovanie mi nefunguje. Príklad JS kódu na šifrovanie:

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;
    };
};

Výsledná položka (encResult) je AesGcmEncryptResult, ktorý má zašifrovanú hodnotu a značku v 2 rôznych vlastnostiach. Ako tomu rozumiem, musím ich skombinovať a odovzdať ako šifrovaný text na dešifrovanie, ako je to:

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);

Potom pripojím oncomplete a onerror a onerror sa spustí. Bohužiaľ, IE objekt Event mi neprináša žiadne informácie, okrem type="error".

Na webe je veľmi málo informácií o používaní AES-GCM v IE 11.

Prosím, nepovedzte mi, aby som použil iný prehliadač. Toto všetko funguje dobre (ale inak) s Chrome a Firefox. Konkrétne sa snažím, aby to fungovalo v IE 11.

Čo mi chýba?

Odpoveď č. 1

Našiel som túto podložku, ktorá (vágne) ukazuje, že hodnota značky ide do objektu algoritmu a samotný šifrový text ide do tretieho argumentu. Napr.

let decryptOp = window.msCrypto.subtle.decrypt({
    name: 'AES-GCM',
    iv: iv,
    additionalData: additionalData,
    tag: new Uint8Array(encResult.tag)
    }, key, new Uint8Array(encResult.ciphertext));

Prečo bolo toto tak ťažké nájsť? Prečo o tejto funkcii nie sú žiadne blogové príspevky? Prečo sú MS-ove dokumenty také stručné na podrobnosti?