Алгоритм RSA относится к классу асимметричных криптосистем, в которых используются две различные ключевые величины: открытый ключ (public key) и закрытый ключ (private key). Открытый ключ применяется для шифрования данных, а закрытый — для их расшифровки. Безопасность RSA основана на вычислительной сложности факторизации больших чисел.
Классическая схема RSA уязвима к ряду атак, если применяется напрямую. Для устранения этих недостатков используется специальная схема дополнения (padding), одной из наиболее надёжных является RSA-OAEP (Optimal Asymmetric Encryption Padding).
RSA-OAEP — это криптографическая схема дополнения, разработанная для повышения стойкости RSA к атакам, связанным с анализом структуры шифротекста. Основная задача OAEP — обеспечить:
В отличие от “голого” RSA, где одинаковые сообщения дают одинаковый шифротекст, OAEP вводит случайность, делая результат уникальным при каждом шифровании.
OAEP строится на основе двух криптографических примитивов:
Процесс OAEP включает несколько этапов преобразования исходного сообщения перед применением RSA.
Пусть имеется сообщение M, которое необходимо
зашифровать.
k — длина модуля RSA в байтахhLen — длина хэш-функцииL — необязательная метка (label), чаще всего пустая
строкаlHash = Hash(L)Создаётся строка:
DB = lHash || PS || 0x01 || M
где:
PS — строка из нулевых байтов0x01 — разделительseed = random(hLen)
dbMask = MGF(seed, k - hLen - 1)
maskedDB = DB XOR dbMask
seedMask = MGF(maskedDB, hLen)
maskedSeed = seed XOR seedMask
EM = 0x00 || maskedSeed || maskedDB
C = RSA_Encrypt(EM, publicKey)
Расшифровка выполняется в обратном порядке:
RSA-дешифрование:
EM = RSA_Decrypt(C, privateKey)Разделение:
0x00)maskedSeedmaskedDBВосстановление:
seedMask = MGF(maskedDB, hLen)
seed = maskedSeed XOR seedMask
dbMask = MGF(seed, k - hLen - 1)
DB = maskedDB XOR dbMask
Проверка lHash
Извлечение сообщения M после байта
0x01
RSA-OAEP обеспечивает высокий уровень защиты благодаря следующим механизмам:
Важно, что безопасность OAEP доказана в рамках модели случайного оракула (Random Oracle Model).
Библиотека jsrsasign предоставляет инструменты для
работы с RSA и OAEP. Основной класс для шифрования —
KJUR.crypto.Cipher.
<script src="jsrsasign-all-min.js"></script>
var pubKey = "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----";
var cipher = new KJUR.crypto.Cipher();
cipher.setAlg("RSAOAEP");
var plaintext = "Hello RSA-OAEP";
var encrypted = cipher.encrypt(plaintext, pubKey);
console.log(encrypted);
var privKey = "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----";
var cipher = new KJUR.crypto.Cipher();
cipher.setAlg("RSAOAEP");
var decrypted = cipher.decrypt(encrypted, privKey);
console.log(decrypted);
В jsrsasign можно указать используемую хэш-функцию:
cipher.setAlg("RSAOAEP", "sha256");
Поддерживаемые алгоритмы:
Максимальный размер сообщения определяется формулой:
mLen ≤ k - 2*hLen - 2
где:
k — размер ключа в байтахhLen — длина хэшаНапример:
Максимальная длина:
256 - 2*32 - 2 = 190 байт
RSA-OAEP применяется для шифрования малых данных, например:
Для больших данных используется гибридная схема:
Использование “голого” RSA
Неправильный выбор хэш-функции
Несоответствие параметров при шифровании и расшифровке
| Характеристика | RSA-OAEP | PKCS#1 v1.5 |
|---|---|---|
| Безопасность | Высокая | Уязвим к атакам |
| Рандомизация | Да | Ограниченная |
| Современность | Рекомендуется | Устаревает |
MGF1 генерирует псевдослучайную последовательность на основе хэш-функции:
MGF1(seed, length)
Работает как конкатенация:
Hash(seed || counter)
Это позволяет создавать маски произвольной длины.
Ключевая особенность OAEP — циклическая зависимость:
Это делает невозможным восстановление исходных данных без полного знания структуры.
Генерация seed критична для безопасности:
В jsrsasign используется встроенный генератор случайных чисел.
RSA-OAEP широко используется в:
RSA-OAEP медленнее симметричных алгоритмов:
При декодировании выполняются строгие проверки:
0x00lHash0x01При нарушении — ошибка, данные считаются недостоверными.
jsrsasign возвращает результат в формате:
Пример:
var b64 = hextob64(encrypted);
EM = 0x00 || maskedSeed || maskedDB
Где:
Такая структура обеспечивает криптографическую стойкость и защищённость от широкого спектра атак.