Правильная процедура обмена ключами для гибридного шифрования с использованием Pycryptodome

Я пишу модуль, который создает безопасный канал связи с использованием сокетов ZeroMQ и Pycryptodome.

Начальное рукопожатие между клиентом и сервером будет следующим:

  1. Обе стороны посылают свои открытые ключи RSA друг другу.
  2. Сервер генерирует сеансовый ключ AES и подпись для этого ключа.
  3. Сервер RSA-шифрует ключ сеанса и подпись перед отправкой его клиенту. (*)
  4. Клиент проверяет подпись и сохраняет сеансовый ключ.
  5. Клиент генерирует токен, генерирует свою подпись и отправляет оба AES-шифрованные на сервер.
  6. Сервер проверяет подпись и возвращает токен.
  7. Если полученный токен совпадает с отправленным, рукопожатие считается успешным.

Я обнаружил в этой теме, что было предпочтительнее подписать сообщение, затем зашифровать его, чем шифровать, а затем подписывать.

Проблема заключается в том, что длина подписи для ключа RSA длиной 2048 бит составляет 256 байт. Максимальный размер шифрования для того же ключа составляет 190 байтов. Это означает, что я не могу зашифровать подпись, как предложено в теме.

Должен ли я зашифровать подпись с помощью сеансового ключа AES? Должен ли я пойти другим путем?

Я знаю, что существуют "стандартизированные" протоколы обмена ключами (например, ECDH), но они еще не доступны в Pycryptodome.

Cipher: RSA PKCS1 OAEP
Signing : PKCS1 PSS w/ BLAKE2b hash

0 ответов

Другие вопросы по тегам