Метод encrypt интерфейса SubtleCrypto
используется для выполнения асимметричного шифрования данных с
использованием открытого ключа. В случае RSA-OAEP он реализует схему
шифрования RSA с оптимальным асимметричным заполнением (Optimal
Asymmetric Encryption Padding), обеспечивающую устойчивость к выбранным
атакам на основе открытого текста.
Шифрование выполняется только с использованием публичного ключа, тогда как расшифрование возможно исключительно приватным ключом, связанным с данной парой.
crypto.subtle.encrypt(algorithm, key, data)
Параметры:
algorithm — объект конфигурации, описывающий
используемый алгоритмkey — объект CryptoKey, содержащий
публичный RSA-ключdata — данные для шифрования (ArrayBuffer
или TypedArray)Возвращаемое значение:
Promise<ArrayBuffer> — зашифрованный результат в
бинарном виде
При использовании RSA-OAEP объект алгоритма выглядит следующим образом:
const algorithm = {
name: "RSA-OAEP",
hash: "SHA-256",
label: new Uint8Array([])
};
nameВсегда фиксировано:
"RSA-OAEP" — указывает на использование схемы OAEP
поверх RSAhashОпределяет хеш-функцию, используемую внутри OAEP для генерации маски.
Поддерживаемые значения:
"SHA-1" (устаревающее, но всё ещё поддерживается в
некоторых окружениях)"SHA-256" (рекомендуемое значение)"SHA-384""SHA-512"Современные реализации Web Crypto API требуют явного указания
hash, так как выбор влияет на криптостойкость и
совместимость ключей.
labelНеобязательный параметр. Представляет собой дополнительные ассоциированные данные (Optional Label), которые включаются в процесс OAEP-паддинга.
Uint8Arraynew Uint8Array([]))Используется редко, но может быть полезен для контекстного связывания шифротекста с определённой системой или протоколом.
Метод encrypt работает только с бинарными данными.
Строки необходимо преобразовывать вручную.
Стандартный способ:
const encoder = new TextEncoder();
const data = encoder.encode("Секретное сообщение");
Результат — Uint8Array, пригодный для передачи в
encrypt.
const publicKey = await crypto.subtle.importKey(
"spki",
publicKeyBuffer,
{
name: "RSA-OAEP",
hash: "SHA-256"
},
false,
["encrypt"]
);
const encoder = new TextEncoder();
const data = encoder.encode("Конфиденциальные данные");
const encrypted = await crypto.subtle.encrypt(
{
name: "RSA-OAEP",
hash: "SHA-256"
},
publicKey,
data
);
encrypted содержит зашифрованный буфер, который
невозможно интерпретировать без приватного ключа.
RSA-OAEP в браузерной реализации имеет ряд ограничений, связанных с природой алгоритма:
RSA не предназначен для шифрования больших объёмов информации.
Максимальный размер входных данных зависит от:
Пример для 2048-битного ключа и SHA-256:
Попытка зашифровать больший буфер приводит к ошибке
OperationError.
Метод возвращает ArrayBuffer, который не содержит
метаданных.
Для передачи по сети или хранения обычно используется Base64-кодирование:
function arrayBufferToBase64(buffer) {
let binary = "";
const bytes = new Uint8Array(buffer);
for (let i = 0; i < bytes.byteLength; i++) {
binary += String.fromCharCode(bytes[i]);
}
return btoa(binary);
}
Возникает, если:
["encrypt"] не
указан при импорте)Возникает при:
ArrayBufferОбобщённая криптографическая ошибка, часто связанная с:
"SHA-512" в
RSA-OAEP{
name: "RSA-OAEP",
hash: "SHA-256"
}
Любое расхождение между ключом и параметрами encrypt
приводит к ошибке выполнения.
Корректная работа encrypt невозможна без согласованной
генерации пары ключей:
const keyPair = await crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-256"
},
true,
["encrypt", "decrypt"]
);
Публичный ключ используется в encrypt, приватный — в
decrypt.
crypto.subtle.encryptRSA-OAEP включает несколько уровней защиты:
Это делает результат шифрования недетерминированным: одинаковый текст при повторном шифровании даёт разные выходные данные.
RSA-OAEP используется не как основной механизм шифрования больших данных, а как способ защиты симметричных ключей.
Типичный паттерн:
Такой подход снижает вычислительную нагрузку и устраняет ограничения RSA по размеру данных.
Результат encrypt совместим только с:
crypto.subtle.decrypt({
name: "RSA-OAEP",
hash: "SHA-256"
}, privateKey, encryptedData);
Несовпадение параметров приводит к невозможности восстановления исходного сообщения, даже при корректном ключе.