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