RSA-OAEP представляет собой схему асимметричного шифрования, в которой классический RSA дополняется механизмом оптимального заполнения OAEP (Optimal Asymmetric Encryption Padding). В контексте Web Crypto API ключевым элементом становится не только сам RSA-алгоритм, но и выбор хеш-функции, которая определяет устойчивость схемы и участвует в формировании маскирующих значений внутри OAEP.
OAEP использует хеширование не как вспомогательную операцию, а как фундаментальный компонент схемы заполнения. Внутри алгоритма хеш-функция задействуется сразу в двух критических местах:
MGF1 работает как генератор псевдослучайной маски на основе выбранного хеша. Именно он обеспечивает «размазывание» структуры исходного сообщения перед применением RSA-операции.
Если упростить внутреннюю механику, OAEP преобразует сообщение следующим образом:
Криптостойкость всей схемы напрямую зависит от свойств выбранной хеш-функции: коллизийной стойкости, устойчивости к прообразу и детерминированности.
В Web Crypto API RSA-OAEP задаётся через объект
SubtleCrypto, где хеш указывается как отдельный параметр
алгоритма:
const algorithm = {
name: "RSA-OAEP",
hash: { name: "SHA-256" }
};
Хеш-функция фиксируется на этапе генерации ключа и становится частью криптографического контракта ключевой пары. Это означает, что ключ, созданный с SHA-256, не может использоваться с SHA-1 без повторной генерации.
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 хеш-функция влияет на:
MGF1 использует выбранный хеш для расширения seed в маску произвольной длины. Чем сильнее хеш, тем устойчивее результат к предсказанию.
OAEP предотвращает атаки, основанные на детерминированности RSA. Слабый хеш снижает эффективность этой защиты.
SHA-1 создаёт 160-битный выход, SHA-256 — 256-битный. Это влияет на размер padding и косвенно на максимальную длину сообщения.
Web Crypto API обычно поддерживает:
Пример с 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 имеет строгую привязку к параметрам:
Приближённая формула ограничения:
maxMessageSize = keySizeInBytes - 2 * hashSizeInBytes - 2
Например, для RSA 2048 и SHA-256:
256 - 2*32 - 2 = 190 bytes
Использование SHA-256 в RSA-OAEP стало де-факто стандартом:
При этом переход между хешами всегда требует миграции ключей, а не только изменения параметра алгоритма.
RSA сам по себе выполняет математическую операцию:
c = m^e mod n
Однако OAEP преобразует сообщение m перед этой
операцией. Хеш-функция участвует в построении:
Таким образом, RSA работает не с исходным сообщением, а с хеш-обработанным структурированным блоком.
Ключ создан с SHA-256, но decrypt вызывается с SHA-1 или без указания корректного алгоритма.
Параметр hash является частью ключа, а не операции шифрования.
Некоторые окружения могут ограничивать SHA-512 или SHA-1.
Хеш-функция в OAEP выполняет функцию связующего слоя между детерминированной математикой RSA и необходимостью случайности в шифровании. Она:
Без хеш-функции OAEP теряет основную часть своей безопасности, превращаясь в уязвимую схему с предсказуемыми свойствами padding.