RSA-PSS: улучшенная схема подписи

RSA-PSS (Probabilistic Signature Scheme) представляет собой вероятностную схему цифровой подписи, разработанную как более безопасная альтернатива классической PKCS#1 v1.5. Основная идея заключается в устранении детерминированности подписи RSA и введении случайности через соль (salt), что значительно усложняет атаки на структуру подписи и повышает устойчивость к криптоанализу.

В отличие от старого подхода, где подпись формируется по фиксированному шаблону, RSA-PSS использует вероятностное кодирование сообщения перед применением RSA-операции. Это делает каждую подпись уникальной даже для одинакового входного сообщения.


Архитектура RSA-PSS

RSA-PSS строится на нескольких ключевых компонентах, каждый из которых играет важную роль в обеспечении криптографической стойкости:

  • Хэш-функция Используется для сжатия сообщения до фиксированной длины (например, SHA-256).

  • Соль (salt) Случайная последовательность байт, добавляемая к сообщению перед хэшированием. Это ключевой элемент, обеспечивающий вероятностность подписи.

  • MGF1 (Mask Generation Function) Функция генерации маски, основанная на выбранной хэш-функции. Она используется для расширения хэш-значений до необходимой длины.

  • EMSA-PSS encoding Специальная схема кодирования сообщения перед применением RSA-операции.


Отличие от PKCS#1 v1.5

Классическая схема PKCS#1 v1.5 формирует подпись по строго заданному формату. Это создаёт несколько проблем:

  • детерминированность подписи;
  • возможность подделки при ошибках реализации;
  • уязвимости к адаптивным атакам.

RSA-PSS решает эти проблемы за счёт:

  • добавления случайности (salt);
  • более строгой математической модели доказуемой стойкости;
  • использования MGF1 для равномерного распределения данных.

Криптографическая модель RSA-PSS

На уровне преобразований схема выглядит следующим образом:

  • вычисляется хэш сообщения;
  • добавляется случайная соль;
  • формируется промежуточная структура M;
  • применяется mask generation function;
  • выполняется RSA-подпись над закодированным блоком.

Ключевой момент заключается в том, что даже одинаковые сообщения дают разные подписи из-за случайной соли.


Реализация RSA-PSS в Jsrsasign

Библиотека Jsrsasign предоставляет поддержку RSA-PSS через класс KJUR.crypto.Signature. Основной алгоритм указывается явно, включая выбор хэша и режима PSS.

Поддерживаемые варианты включают:

  • SHA256withRSAandMGF1
  • SHA512withRSAandMGF1
  • RSA-PSS

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

Перед использованием подписи необходимо создать ключевую пару RSA:

const KEYUTIL = KJUR.KEYUTIL;

const rsaKey = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = rsaKey.prvKeyObj;
const publicKey = rsaKey.pubKeyObj;

Создание подписи RSA-PSS

Процесс подписи включает выбор алгоритма, настройку параметров PSS и выполнение операции:

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(privateKey);
sig.updateString("Сообщение для подписи");

const signature = sig.sign();

Проверка подписи

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

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.init(publicKey);
sig.updateString("Сообщение для подписи");

const isValid = sig.verify(signature);

Настройка параметров RSA-PSS

Jsrsasign позволяет управлять ключевыми параметрами схемы:

  • hashAlg — алгоритм хэширования (SHA-256, SHA-512)
  • mgf1HashAlg — хэш для MGF1
  • saltLength — длина соли

Пример настройки:

const sig = new KJUR.crypto.Signature({
  alg: "SHA256withRSAandMGF1",
  prov: "cryptojs/jsrsa"
});

sig.setParameters({
  "prng": "crypto",
  "saltLength": 32
});

Увеличение длины соли повышает криптостойкость, но может снижать совместимость с некоторыми реализациями.


Внутренний механизм работы Jsrsasign

При вызове sign() библиотека выполняет следующие этапы:

  1. Хэширование входного сообщения.
  2. Генерация случайной соли через PRNG.
  3. Формирование структуры EMSA-PSS.
  4. Применение MGF1 для маскирования данных.
  5. Кодирование в формате, совместимом с RSA.
  6. Возведение в степень по приватному ключу RSA.

При проверке подписи выполняется обратный процесс с повторным вычислением хэша и сравнением структур.


Совместимость и интероперабельность

RSA-PSS поддерживается большинством современных криптографических библиотек и стандартов:

  • WebCrypto API;
  • OpenSSL;
  • BouncyCastle;
  • Node.js crypto module.

Однако различия в параметрах (особенно salt length и hash algorithm) часто приводят к несовместимости. В Jsrsasign это требует строгого согласования конфигурации между сторонами.


Практические особенности использования

При работе с RSA-PSS в реальных приложениях важны следующие аспекты:

  • одинаковый выбор алгоритма хэширования на всех участниках;
  • согласование длины соли;
  • использование криптографически стойкого генератора случайных чисел;
  • проверка корректности публичного ключа перед верификацией;
  • контроль версии реализации RSA-PSS в сторонних системах.

Частые ошибки при реализации

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

  • несовпадение hashAlg между подписью и проверкой;
  • использование устаревшего PKCS#1 v1.5 при ожидании PSS;
  • неправильная настройка saltLength;
  • отсутствие криптографически стойкого PRNG;
  • попытка проверки подписи с другим padding scheme.

Такие ошибки приводят к невозможности верификации даже при корректных данных.


Применение RSA-PSS в современных системах

RSA-PSS используется в:

  • TLS 1.3 и современных TLS-конфигурациях;
  • цифровых сертификатах X.509 нового поколения;
  • электронных подписях;
  • системах аутентификации API;
  • инфраструктурах PKI.

Его распространение связано с переходом криптографической индустрии к моделям с доказуемой стойкостью и минимизацией детерминированных схем.


Работа в браузере и Node.js

Jsrsasign одинаково работает как в браузере, так и в Node.js, поскольку реализует криптографию на Jav * aScript:

// Node.js или браузер
const KJUR = require("jsrsasign");

В браузере библиотека может подключаться через CDN:

<script src="https://cdn.jsdelivr.net/npm/jsrsasign"></script>

После подключения доступен полный набор API для RSA-PSS без необходимости использования нативных криптографических модулей.


Криптографическая устойчивость RSA-PSS

RSA-PSS считается одной из наиболее надёжных схем RSA-подписи благодаря:

  • вероятностной природе;
  • строгому формальному доказательству стойкости;
  • отсутствию структурных атак, характерных для PKCS#1 v1.5;
  • гибкости в выборе параметров хэширования и маскирования.

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