RSA-OAEP: принцип работы и параметры

Структура RSA-OAEP как схемы асимметричного шифрования

RSA-OAEP (Optimal Asymmetric Encryption Padding) представляет собой современную схему асимметричного шифрования на основе RSA, в которой используется дополнительное рандомизированное заполнение сообщения перед шифрованием. Это устраняет ряд уязвимостей классического RSA, связанных с детерминированностью и возможностью атак на структуру открытого текста.

В контексте Web Crypto API RSA-OAEP реализуется через интерфейс SubtleCrypto, доступный как crypto.subtle. Основная идея заключается в разделении ключевой пары на открытый и закрытый ключи, где:

  • Открытый ключ используется для шифрования данных
  • Закрытый ключ используется для расшифрования

Базовый принцип работы RSA-OAEP

Процесс шифрования в RSA-OAEP включает несколько этапов:

  1. Исходное сообщение преобразуется в байтовый формат
  2. К сообщению применяется схема OAEP-паддинга
  3. Добавляется случайная энтропия
  4. Результат возводится в степень по модулю RSA-ключа с использованием открытой экспоненты

Схема OAEP использует хэш-функции и генератор маски (MGF1), что обеспечивает:

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

Основные параметры RSA-OAEP в Web Crypto API

При создании или использовании RSA-OAEP ключей ключевую роль играют параметры алгоритма.

name

Определяет используемый алгоритм:

name: "RSA-OAEP"

Этот параметр обязателен и должен строго соответствовать строке "RSA-OAEP".


modulusLength

Размер модуля RSA в битах. Определяет криптографическую стойкость.

Типичные значения:

  • 2048 бит — минимально допустимый уровень безопасности
  • 3072 бит — повышенная стойкость
  • 4096 бит — высокая стойкость, но сниженная производительность
modulusLength: 2048

Увеличение длины модуля напрямую влияет на:

  • скорость генерации ключей
  • скорость шифрования/расшифрования
  • максимальный размер сообщения

publicExponent

Открытая экспонента RSA. В Web Crypto API передаётся в виде Uint8Array.

Наиболее распространённое значение:

  • 65537 (0x010001)
publicExponent: new Uint8Array([1, 0, 1])

Выбор 65537 обусловлен балансом между безопасностью и производительностью.


hash

Хэш-функция, используемая внутри OAEP для генерации масок.

Поддерживаемые значения:

  • "SHA-1" (устаревший, не рекомендуется)
  • "SHA-256" (стандарт де-факто)
  • "SHA-384"
  • "SHA-512"

Пример:

hash: "SHA-256"

Хэш-функция влияет на безопасность схемы OAEP и размер внутренних блоков преобразования.


label (необязательный параметр при шифровании/расшифровании)

Дополнительные данные, связываемые с шифротекстом. Используется редко, но входит в спецификацию OAEP.

  • Может быть ArrayBuffer, TypedArray или undefined
  • Должен совпадать при шифровании и расшифровании

Генерация RSA-OAEP ключей

Создание ключевой пары выполняется через generateKey.

const keyPair = await crypto.subtle.generateKey(
  {
    name: "RSA-OAEP",
    modulusLength: 2048,
    publicExponent: new Uint8Array([1, 0, 1]),
    hash: "SHA-256"
  },
  true,
  ["encrypt", "decrypt"]
);

Параметр extractable определяет возможность экспорта ключей. Значение true допускает извлечение ключа, false повышает безопасность.


Шифрование данных

Шифрование выполняется с использованием открытого ключа:

const encoded = new TextEncoder().encode("секретное сообщение");

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

Результат представляет собой ArrayBuffer, содержащий зашифрованные данные.


Расшифрование данных

Расшифрование выполняется с использованием закрытого ключа:

const decrypted = await crypto.subtle.decrypt(
  {
    name: "RSA-OAEP"
  },
  keyPair.privateKey,
  ciphertext
);

const decoded = new TextDecoder().decode(decrypted);

Ограничения RSA-OAEP

RSA-OAEP не предназначен для шифрования больших объёмов данных. Максимальный размер сообщения ограничен длиной ключа и используемым хэшом.

Приближённая формула ограничения:

maxMessageSize ≈ keySizeInBytes - 2 * hashSize - 2

Для RSA 2048 и SHA-256:

  • keySize = 256 bytes
  • hashSize = 32 bytes
  • max ≈ 190 bytes

По этой причине RSA-OAEP обычно применяется для:

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

Использование RSA-OAEP в гибридной криптографии

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

  1. Генерация симметричного ключа (AES-GCM)

  2. Шифрование данных AES

  3. Шифрование AES-ключа через RSA-OAEP

  4. Передача:

    • зашифрованных данных
    • зашифрованного ключа

Такой подход объединяет:

  • скорость симметричного шифрования
  • безопасность асимметричного распределения ключей

Импорт и экспорт ключей

RSA-OAEP ключи могут быть сериализованы в формате spki (public key) и pkcs8 (private key).

Экспорт:

const exportedPublic = await crypto.subtle.exportKey(
  "spki",
  keyPair.publicKey
);

Импорт:

const importedPublic = await crypto.subtle.importKey(
  "spki",
  exportedPublic,
  {
    name: "RSA-OAEP",
    hash: "SHA-256"
  },
  true,
  ["encrypt"]
);

Внутренняя роль OAEP в защите данных

OAEP добавляет к сообщению структуру вида:

EM = 0x00 || maskedSeed || maskedDB

Где:

  • seed — случайная величина
  • DB — блок данных (сообщение + label + padding)
  • MGF1 — функция генерации маски на основе хэша

Это обеспечивает:

  • скрытие структуры сообщения
  • устойчивость к атакам восстановления текста
  • отсутствие детерминированности результата

Совместимость и поддержка в браузерах

Web Crypto API с RSA-OAEP поддерживается во всех современных браузерах через объект:

window.crypto.subtle

Особенности реализации:

  • операции всегда асинхронны
  • доступ только в secure context (HTTPS)
  • отсутствует прямой доступ к приватному ключу в памяти JavaScript

Типовые ошибки при работе с RSA-OAEP

  • Несовпадение hash при генерации и импорте ключей
  • Использование неподдерживаемого publicExponent
  • Попытка шифровать данные, превышающие допустимый размер
  • Несовпадение label при encrypt/decrypt
  • Попытка использовать ключ не для заявленной операции (encrypt/decrypt)

Практическая модель использования RSA-OAEP в Web Crypto API

Типичный поток работы:

  1. Генерация пары ключей
  2. Экспорт открытого ключа
  3. Передача открытого ключа получателю
  4. Шифрование коротких данных или симметричного ключа
  5. Передача зашифрованного результата
  6. Расшифрование закрытым ключом

Такая модель лежит в основе большинства веб-криптосистем, использующих RSA-OAEP в качестве слоя защиты ключей.