Здесь две проблемы:
A) Ваш протокол протекает неправильно.Если вы хотите использовать RSA для обмена сообщениями, алгоритм таков:
Зашифровывает сообщение, используя B public key
A, отправляет сообщение
B расшифровывает сообщение, используя личный ключ B
(B выполняет обработку)
B шифрует сообщение, используя открытый ключ A
B отправляет сообщение
A, расшифровывает сообщение, используя личный ключ
и т. Д.Обратите внимание, что A не знает закрытый ключ B, и наоборот.Открытый и закрытый ключи связаны таким образом, что сообщение, зашифрованное открытым ключом (известным каждому), может быть расшифровано только с соответствующим закрытым ключом (известным только получателю зашифрованного сообщения).В этом-то и весь смысл RSA.
Что касается реализации в C #, то сделать с классами Crypto довольно просто, когда вы действительно поймете основные концепции.См., Например, здесь и здесь .
B) RSA подходит для обмена небольшими объемами данных.Он предназначен для обмена ключами по небезопасному каналу без необходимости использования общего секрета.Для обмена «нормальными» данными используется симметричный алгоритм, такой как AES.Таким образом, идея состоит в том, чтобы сгенерировать случайную фразу-пароль и IV из A и отправить ее B через RSA, как обсуждалось в A;после того, как обе стороны знают кодовую фразу и IV, они могут просто зашифровать данные, используя AES с общим ключом.
Это то, что делает SSL, и у вас должна быть действительно веская причина, чтобы кататься самостоятельно вместо использования стандартного потока SSL.