Pycryptodome Создание взаимно сгенерированного ключа сеанса
Использование pyCryptodome для генерации ключа сеанса между клиентом и сервером для зашифрованного приложения чата. Ключ сеанса генерируется взаимно, используя открытый и закрытый ключи RSA. Сообщения чата затем должны быть зашифрованы с использованием AES с ключом сеанса.
Ключ сеанса состоит из случайного 16-байтового значения как от клиента, так и от сервера, которые добавляются и хешируются вместе.
Я успешно отправил случайный 16-байтовый клиент (PassA), который подписан закрытым ключом клиента и зашифрован открытым ключом сервера, как в протоколе:
{PassA, {H (PassA) privKeyA }}pubKeyB
я использую pkcs1_15.new(clientPrivateKey)
чтобы подписать случайные байты, где ключ клиента генерируется: RSA.generate(2048)
, Затем значение со знаком добавляется к значению случайных байтов в виде открытого текста, и все это шифруется с помощью PKCS1_OAEP.new(serverPublicKey)
объект, где ключ сервера генерируется RSA.generate(4096)
,
У меня проблема в том, что, когда я пытаюсь сделать обратное (отправка случайных 16 байтов с сервера на клиент), я получаю сообщение об ошибке:
Открытый текст слишком длинный.
Причина этого заключается в функции шифрования RSA, которая может принимать только значение:
не длиннее, чем модуль RSA (в байтах) минус 2, минус удвоенный размер выходного хэша.
Так что проблема в ключевых размерах. Чтобы отправить случайное значение по вышеуказанному протоколу, размер ключа получателя должен быть больше, чем размер ключа отправителя. Но так как я пытаюсь отправить случайные значения в обоих направлениях, невозможно, чтобы размеры ключей клиента и сервера были одновременно больше друг друга.
Есть ли решение этой проблемы?