Ограничения RSA на размер шифруемых данных

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

Пример расчёта для Web Crypto API

RSA 2048 + SHA-256

  • длина ключа: 2048 бит = 256 байт
  • SHA-256: 32 байта

Подставляем:

256 - 2 * 32 - 2 = 190 байт

Итог: максимум около 190 байт полезных данных.

RSA 4096 + SHA-256

  • 4096 бит = 512 байт
512 - 64 - 2 = 446 байт

Даже при увеличении ключа рост лимита остаётся линейным и всё равно ограничен сотнями байт.

Ограничения WebCrypto SubtleCrypto

В браузерной реализации дополнительно накладываются архитектурные ограничения:

  • RSA-операции синхронно не выполняются (всегда Promise-based)
  • поддерживается только OAEP для шифрования (PKCS#1 v1.5 в ряде окружений ограничен или исключён)
  • входные данные должны быть ArrayBuffer или TypedArray
  • нет встроенного механизма потокового шифрования

Это делает RSA в Web Crypto непригодным для работы с файлами, JSON-документами или любыми данными больше нескольких сотен байт.

Типичный пример использования RSA-OAEP

const encoded = new TextEncoder().encode("secret data");

const ciphertext = await crypto.subtle.encrypt(
  {
    name: "RSA-OAEP"
  },
  publicKey,
  encoded
);

При попытке передать данные, превышающие допустимый размер, операция завершается ошибкой OperationError.

Почему нельзя просто «увеличить RSA»

Увеличение длины ключа действительно увеличивает допустимый размер сообщения, но приводит к ряду проблем:

  • резкое падение производительности (особенно при расшифровке)
  • рост стоимости криптографических операций
  • увеличение размера ключей и накладных расходов при передаче
  • отсутствие линейного масштабирования эффективности

Поэтому RSA в криптографических системах не предназначен для шифрования больших данных даже при технической возможности увеличения ключа.

Практическое ограничение архитектуры WebCrypto

В реальных WebCrypto-сценариях RSA используется только для:

  • шифрования симметричного ключа (AES key wrapping)
  • цифровой подписи
  • обмена ключами в гибридных схемах

Типичная архитектура:

  1. Генерируется симметричный ключ (AES-GCM)
  2. Данные шифруются симметричным алгоритмом
  3. RSA используется только для шифрования AES-ключа

Гибридное шифрование как стандартное решение

Из-за ограничений RSA Web Crypto API практически всегда применяется гибридная схема:

  • RSA-OAEP — для шифрования ключа
  • AES-GCM — для шифрования данных

Пример структуры:

RSA(public key)
   ↓ encrypt
AES key
   ↓ encrypt
данные (любого размера)

Такой подход полностью снимает ограничение на размер данных, так как RSA работает только с фиксированным небольшим блоком — ключом.

Ошибки при превышении лимита

При попытке зашифровать данные, превышающие допустимый размер, Web Crypto API возвращает исключение:

  • OperationError

Это происходит на этапе выполнения encrypt, а не при инициализации ключа или параметров, что часто усложняет отладку.

Зависимость от хэш-функции OAEP

Выбор хэш-функции напрямую влияет на доступный объём данных:

  • SHA-1 (20 байт) → больше доступного пространства
  • SHA-256 (32 байта) → меньше полезной нагрузки
  • SHA-512 (64 байта) → ещё меньше

Однако в современных браузерах SHA-256 является минимальным безопасным стандартом, поэтому фактический лимит всегда ближе к нижней границе.

Итоговая характеристика RSA в WebCrypto

  • ограничение измеряется сотнями байт
  • зависит от размера ключа и OAEP-хэша
  • не предназначен для прямого шифрования данных
  • используется только как вспомогательный механизм в гибридных схемах
  • увеличение ключа не решает архитектурное ограничение, а лишь смещает его

RSA в Web Crypto API следует рассматривать не как инструмент шифрования данных, а как механизм безопасной передачи симметрических ключей и обеспечения криптографической идентичности.