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

Я пишу модуль, который создает безопасный канал связи с использованием сокетов 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
...