Хеш-алгоритм в составе RSA-OAEP

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

OAEP использует хеширование не как вспомогательную операцию, а как фундаментальный компонент схемы заполнения. Внутри алгоритма хеш-функция задействуется сразу в двух критических местах:

  • формирование mask generation function (MGF1)
  • хеширование параметра label (L), который по умолчанию является пустой строкой

MGF1 работает как генератор псевдослучайной маски на основе выбранного хеша. Именно он обеспечивает «размазывание» структуры исходного сообщения перед применением RSA-операции.

Если упростить внутреннюю механику, OAEP преобразует сообщение следующим образом:

  • создаётся случайное значение seed
  • из seed и данных сообщения формируются маски через MGF1
  • обе части (seed и message block) маскируются хеш-выводами

Криптостойкость всей схемы напрямую зависит от свойств выбранной хеш-функции: коллизийной стойкости, устойчивости к прообразу и детерминированности.

Поддержка RSA-OAEP в Web Crypto API

В Web Crypto API RSA-OAEP задаётся через объект SubtleCrypto, где хеш указывается как отдельный параметр алгоритма:

const algorithm = {
  name: "RSA-OAEP",
  hash: { name: "SHA-256" }
};

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

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

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

Параметр hash здесь определяет не только внутреннюю работу OAEP, но и формат совместимости ключа. Разные хеши создают несовместимые ключевые пары.

Значение выбора хеша

На уровне RSA-OAEP хеш-функция влияет на:

1. Генерацию масок MGF1

MGF1 использует выбранный хеш для расширения seed в маску произвольной длины. Чем сильнее хеш, тем устойчивее результат к предсказанию.

2. Стойкость к атаке на структуру padding

OAEP предотвращает атаки, основанные на детерминированности RSA. Слабый хеш снижает эффективность этой защиты.

3. Размер внутреннего хеш-блока

SHA-1 создаёт 160-битный выход, SHA-256 — 256-битный. Это влияет на размер padding и косвенно на максимальную длину сообщения.

Поддерживаемые хеш-функции

Web Crypto API обычно поддерживает:

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

Пример с SHA-512:

const algorithm = {
  name: "RSA-OAEP",
  hash: { name: "SHA-512" }
};

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

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

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

Важно, что хеш не указывается при шифровании отдельно — он уже зафиксирован внутри ключа.

Расшифрование

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

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

Совпадение хеша между ключами и алгоритмом является обязательным условием корректного декодирования. Несовпадение приводит к ошибке OperationError.

Совместимость и ограничения

RSA-OAEP в Web Crypto API имеет строгую привязку к параметрам:

  • изменение хеша требует пересоздания ключевой пары
  • нельзя смешивать SHA-1 и SHA-256 в одной паре ключей
  • максимальный размер сообщения зависит от длины ключа и размера хеша

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

maxMessageSize = keySizeInBytes - 2 * hashSizeInBytes - 2

Например, для RSA 2048 и SHA-256:

  • key size: 256 bytes
  • hash size: 32 bytes
256 - 2*32 - 2 = 190 bytes

Практические последствия выбора SHA-256

Использование SHA-256 в RSA-OAEP стало де-факто стандартом:

  • SHA-1 считается криптографически устаревшим
  • SHA-256 обеспечивает более высокий уровень устойчивости к коллизиям
  • современные браузеры и платформы ориентированы на SHA-256 как базовый вариант

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

Внутреннее взаимодействие RSA и OAEP через хеш

RSA сам по себе выполняет математическую операцию:

c = m^e mod n

Однако OAEP преобразует сообщение m перед этой операцией. Хеш-функция участвует в построении:

  • случайного seed
  • маски для блока данных
  • маски для seed

Таким образом, RSA работает не с исходным сообщением, а с хеш-обработанным структурированным блоком.

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

Несовпадение алгоритма ключа и операции

Ключ создан с SHA-256, но decrypt вызывается с SHA-1 или без указания корректного алгоритма.

Попытка смены хеша без регенерации ключа

Параметр hash является частью ключа, а не операции шифрования.

Использование неподдерживаемого хеша

Некоторые окружения могут ограничивать SHA-512 или SHA-1.

Архитектурная роль хеша в RSA-OAEP

Хеш-функция в OAEP выполняет функцию связующего слоя между детерминированной математикой RSA и необходимостью случайности в шифровании. Она:

  • превращает seed в псевдослучайную маску
  • обеспечивает криптографическую «развязку» структуры сообщения
  • защищает от атак на формат RSA-подстановки

Без хеш-функции OAEP теряет основную часть своей безопасности, превращаясь в уязвимую схему с предсказуемыми свойствами padding.