Почему функция шифрования WebCryptoAPI RSA-OAEP не может использовать ожидаемый максимальный размер порции для данного размера ключа? - PullRequest
2 голосов
/ 18 мая 2019

Я пытаюсь использовать crypto.subtle.encrypt для шифрования некоторых данных и столкнулся с проблемой количества данных, которое я могу зашифровать за один раз. Максимальный размер блока для 2048-битного ключа с использованием RSA-OAEP составляет 214 байт, как указано в ссылках crypto.stackexchange.com и stackoverflow.com с использованием отношения maxChunkSizeInBytes = keySizeInBytes – 42.

Используя crypto.subtle.encrypt с 2048-битным ключом и алгоритмом RSA-OAEP, я могу зашифровать только 190 байтов. Любое количество ниже 190 байт работает нормально, а любое больше 190 байт приводит к ошибке. Я не совсем уверен, тип ошибки (так как я не могу ее перехватить), но я думаю, что это OperationError, ссылка developer.mozilla.org .

В показанном здесь примере TypeScript есть два блока данных d1 и d2 с размерами 190 байт и 214 байт соответственно. Блок данных d1 прекрасно шифрует, а d2 - нет.

const MSG_LEN_1 = 190;
const MSG_LEN_2 = 214;

const d1 = (window.crypto.getRandomValues(new Uint8Array(MSG_LEN_1))).buffer;
const d2 = (window.crypto.getRandomValues(new Uint8Array(MSG_LEN_2))).buffer;

let encData = async (data: ArrayBuffer) => {
    const key = await crypto.subtle.generateKey(
        {
            name: "RSA-OAEP",
            modulusLength: 2048,
            publicExponent: new Uint8Array([1, 0, 1]),
            hash: "SHA-256",
        },
        true,
        ["encrypt", "decrypt"]
    );
    const enc = await crypto.subtle.encrypt(
            {
              name: "RSA-OAEP"
            },
            key.publicKey,
            data
          );
    return enc;
};

encData(d1).then(
    (enc : ArrayBuffer) => {
        alert("Success working on d1");
    }
);

encData(d2).then(
    (enc : ArrayBuffer) => {
            alert("Success working on d2");
    }
);

При компиляции и запуске вышеуказанного TypeScript в Firefox и Chrome (путем включения в простую HTML-страницу) я замечаю ошибку Uncaught (in promise) DOMException в консоли разработчика после первого предупреждения.

Что-то мне не хватает при использовании crypto.subtle.encrypt или неправильно при использовании алгоритма RSA-OAEP?

1 Ответ

1 голос
/ 18 мая 2019

Используя формулу modulus size - 2 - 2*hash size, он работает правильно для SHA256 (32 байта).Похоже, вы применяете размер SHA1 (20 байт)

  • SHA256: 256 - 2 - 2*32 = 190

  • SHA1: 256 - 2 - 2*20 = 214

...