Правильная процедура обмена ключами для гибридного шифрования с использованием Pycryptodome
Я пишу модуль, который создает безопасный канал связи с использованием сокетов ZeroMQ и Pycryptodome.
Начальное рукопожатие между клиентом и сервером будет следующим:
- Обе стороны посылают свои открытые ключи RSA друг другу.
- Сервер генерирует сеансовый ключ AES и подпись для этого ключа.
- Сервер RSA-шифрует ключ сеанса и подпись перед отправкой его клиенту. (*)
- Клиент проверяет подпись и сохраняет сеансовый ключ.
- Клиент генерирует токен, генерирует свою подпись и отправляет оба AES-шифрованные на сервер.
- Сервер проверяет подпись и возвращает токен.
- Если полученный токен совпадает с отправленным, рукопожатие считается успешным.
Я обнаружил в этой теме, что было предпочтительнее подписать сообщение, затем зашифровать его, чем шифровать, а затем подписывать.
Проблема заключается в том, что длина подписи для ключа RSA длиной 2048 бит составляет 256 байт. Максимальный размер шифрования для того же ключа составляет 190 байтов. Это означает, что я не могу зашифровать подпись, как предложено в теме.
Должен ли я зашифровать подпись с помощью сеансового ключа AES? Должен ли я пойти другим путем?
Я знаю, что существуют "стандартизированные" протоколы обмена ключами (например, ECDH), но они еще не доступны в Pycryptodome.
Cipher: RSA PKCS1 OAEP
Signing : PKCS1 PSS w/ BLAKE2b hash