Я пытаюсь использовать 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?