RSA в Web Crypto API реализован через интерфейс
SubtleCrypto и используется в основном для операций
шифрования небольших объёмов данных, а также для обмена ключами и
цифровых подписей. Главная особенность алгоритма заключается в жёстком
ограничении на размер входного сообщения, которое может быть зашифровано
за одну операцию.
RSA работает не с произвольными потоками данных, а с числами фиксированного размера, равного модулю ключа. Например, при использовании 2048-битного ключа модуль имеет размер 256 байт. Однако часть этого пространства занимает служебная информация, связанная с режимом паддинга.
В Web Crypto API для шифрования RSA используется схема:
RSA-OAEP (Optimal Asymmetric Encryption Padding)Именно паддинг определяет, сколько полезных байт можно закодировать внутри одного RSA-шифртекста.
Максимальный размер исходных данных зависит от длины ключа и выбранной хэш-функции OAEP.
Для RSA-OAEP:
maxMessageSize = k - 2 * hLen - 2
где:
k — размер модуля RSA в байтахhLen — длина хэш-выхода выбранной функции (в
байтах)2 и -2 — константы, определённые
спецификацией OAEPПодставляем:
256 - 2 * 32 - 2 = 190 байт
Итог: максимум около 190 байт полезных данных.
512 - 64 - 2 = 446 байт
Даже при увеличении ключа рост лимита остаётся линейным и всё равно ограничен сотнями байт.
В браузерной реализации дополнительно накладываются архитектурные ограничения:
ArrayBuffer или
TypedArrayЭто делает RSA в Web Crypto непригодным для работы с файлами, JSON-документами или любыми данными больше нескольких сотен байт.
const encoded = new TextEncoder().encode("secret data");
const ciphertext = await crypto.subtle.encrypt(
{
name: "RSA-OAEP"
},
publicKey,
encoded
);
При попытке передать данные, превышающие допустимый размер, операция
завершается ошибкой OperationError.
Увеличение длины ключа действительно увеличивает допустимый размер сообщения, но приводит к ряду проблем:
Поэтому RSA в криптографических системах не предназначен для шифрования больших данных даже при технической возможности увеличения ключа.
В реальных WebCrypto-сценариях RSA используется только для:
Типичная архитектура:
Из-за ограничений RSA Web Crypto API практически всегда применяется гибридная схема:
Пример структуры:
RSA(public key)
↓ encrypt
AES key
↓ encrypt
данные (любого размера)
Такой подход полностью снимает ограничение на размер данных, так как RSA работает только с фиксированным небольшим блоком — ключом.
При попытке зашифровать данные, превышающие допустимый размер, Web Crypto API возвращает исключение:
OperationErrorЭто происходит на этапе выполнения encrypt, а не при
инициализации ключа или параметров, что часто усложняет отладку.
Выбор хэш-функции напрямую влияет на доступный объём данных:
Однако в современных браузерах SHA-256 является минимальным безопасным стандартом, поэтому фактический лимит всегда ближе к нижней границе.
RSA в Web Crypto API следует рассматривать не как инструмент шифрования данных, а как механизм безопасной передачи симметрических ключей и обеспечения криптографической идентичности.