Как расшифровать данные из результата операции шифрования IE 11 с использованием AES-GCM

Мне удалось зашифровать некоторые данные с помощью AES-GCM с помощью IE 11 в Windows 10, но я не могу получить расшифровку для работы. Пример шифрования JS-кода:

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

Результирующий элемент (encResult) представляет собой AesGcmEncryptResult, который имеет зашифрованное значение и тег в 2 разных свойствах. Насколько я понимаю, мне нужно объединить их и передать их как зашифрованный текст для расшифровки, как в:

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

Затем я подключаюсь к неполным, а также к ошибкам с ошибками. К сожалению, объекту IE в IE нечего сказать, кроме type = "error".

В Интернете очень мало информации об использовании AES-GCM в IE 11.

Пожалуйста, не говорите мне использовать другой браузер. Это все работает отлично (но по-разному) с Chrome и Firefox. Я специально пытаюсь заставить это работать в IE 11.

Что мне не хватает?

1 ответ

Решение

Я нашел эту прокладку, которая (смутно) показывает, что значение тега входит в объект алгоритма, а один только зашифрованный текст - в третий аргумент. Например

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

Почему это было так трудно найти? Почему в блоге нет сообщений об этой функции? Почему в документах MS так мало подробностей?

Другие вопросы по тегам