RSA-OAEP (Optimal Asymmetric Encryption Padding) представляет собой современную схему асимметричного шифрования на основе RSA, в которой используется дополнительное рандомизированное заполнение сообщения перед шифрованием. Это устраняет ряд уязвимостей классического RSA, связанных с детерминированностью и возможностью атак на структуру открытого текста.
В контексте Web Crypto API RSA-OAEP реализуется через интерфейс
SubtleCrypto, доступный как crypto.subtle.
Основная идея заключается в разделении ключевой пары на открытый и
закрытый ключи, где:
Процесс шифрования в RSA-OAEP включает несколько этапов:
Схема OAEP использует хэш-функции и генератор маски (MGF1), что обеспечивает:
При создании или использовании RSA-OAEP ключей ключевую роль играют параметры алгоритма.
Определяет используемый алгоритм:
name: "RSA-OAEP"
Этот параметр обязателен и должен строго соответствовать строке
"RSA-OAEP".
Размер модуля RSA в битах. Определяет криптографическую стойкость.
Типичные значения:
modulusLength: 2048
Увеличение длины модуля напрямую влияет на:
Открытая экспонента RSA. В Web Crypto API передаётся в виде
Uint8Array.
Наиболее распространённое значение:
publicExponent: new Uint8Array([1, 0, 1])
Выбор 65537 обусловлен балансом между безопасностью и производительностью.
Хэш-функция, используемая внутри OAEP для генерации масок.
Поддерживаемые значения:
"SHA-1" (устаревший, не рекомендуется)"SHA-256" (стандарт де-факто)"SHA-384""SHA-512"Пример:
hash: "SHA-256"
Хэш-функция влияет на безопасность схемы OAEP и размер внутренних блоков преобразования.
Дополнительные данные, связываемые с шифротекстом. Используется редко, но входит в спецификацию OAEP.
ArrayBuffer, TypedArray или
undefinedСоздание ключевой пары выполняется через
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 не предназначен для шифрования больших объёмов данных. Максимальный размер сообщения ограничен длиной ключа и используемым хэшом.
Приближённая формула ограничения:
maxMessageSize ≈ keySizeInBytes - 2 * hashSize - 2
Для RSA 2048 и SHA-256:
По этой причине RSA-OAEP обычно применяется для:
Типичная архитектура:
Генерация симметричного ключа (AES-GCM)
Шифрование данных AES
Шифрование AES-ключа через RSA-OAEP
Передача:
Такой подход объединяет:
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 добавляет к сообщению структуру вида:
EM = 0x00 || maskedSeed || maskedDB
Где:
Это обеспечивает:
Web Crypto API с RSA-OAEP поддерживается во всех современных браузерах через объект:
window.crypto.subtle
Особенности реализации:
hash при генерации и импорте ключейpublicExponentlabel при encrypt/decryptencrypt/decrypt)Типичный поток работы:
Такая модель лежит в основе большинства веб-криптосистем, использующих RSA-OAEP в качестве слоя защиты ключей.