Я пытаюсь обменяться открытыми ключами по TCP-соединению.Мне будет легче, если я смогу сделать это, сохраняя эти ключи в классе пакета, сериализуя объект пакета, преобразовывая его в байтовый массив и затем отправляя его по соединению tcp.
Проблема, с которой я сталкиваюсьявляется то, что большинство времени дешифрования не удается, когда зашифрованное сообщение возвращается с помощью этого метода.Я не могу быть уверен, почему это так, но, насколько я понимаю, использование библиотеки Encoding.Unicode может привести к повреждению, если вы отправляете ключи.Я ищу способ отправки этих ключей (желательно в формате JSON) по TCP-соединению без их повреждения.
Я также прочитал, что Convert.FromBase64String () являетсяисточник для кодирования без искажений, но он не всегда может преобразовать строки JSON, поскольку они имеют неправильное форматирование.
//Sets up a tcp conncetion and encrypts a packet
void EncryptAndSend()
{
//Recieve a string with the public key of the other side with this packet method except I don't encrypt that packet
//The key is in the format given by rsa.ToXmlString
string pub_key = "public_key_xml_format";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(pub_key);
string plaintext = "Some plaintext";
string password = "pass";
Packet packet = new Packet(PacketType.ENCRYPTED_MESSAGE, plaintext, 0, 1);
string encrypted_plain = SymmetricEncrypt(plaintext, password);
packet.payload = encrypted_plain;
packet.password = Encoding.Unicode.GetString(rsa.Encrypt(Encoding.Unicode.GetBytes(password), false));
string serialized_packet = new JavaScriptSerializer().Serialize(packet);
byte[] bytes = Encoding.Unicode.GetBytes(serialized_packet);
var client = new TcpClient("127.0.0.1", 5300);
client.GetStream().Write(bytes, 0, bytes.Length);
}
//Sets up a tcp connection and decrypts a packet
void RecieveAndDecrypt()
{
var listener = new TcpListener(IPAddress.Loopback, 5300);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
var stream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
while (client.Connected)
{
try
{
Array.Clear(buffer, 0, buffer.Length);
int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
Decrypt(buffer);
}
catch
{
Console.WriteLine("Client disconnected");
}
}
}
//Decrypts and prints the packet payload
void Decrypt(byte[] buffer)
{
string pub_key = "lol";
string strbuf = Encoding.Unicode.GetString(buffer);
Packet packet = new JavaScriptSerializer().Deserialize<Packet>(strbuf);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(pub_key);
byte[] decrypt_pass = rsa.Decrypt(Encoding.Unicode.GetBytes(packet.password), false);
string decrypted_payload = SymmetricDecrypt(packet.payload, Encoding.Unicode.GetString(decrypt_pass));
Console.WriteLine(decrypted_payload);
}
Я запускаю шифратор в одном потоке, а расшифровщик - в другом,Перед их запуском я отправляю открытый ключ со стороны расшифровки в виде строки xml.Я пропустил этот код, потому что я подумал, что мой макет уже был достаточно длинным, и я не хочу кого-либо перегружать.Если вам нужен исходный исходный код проекта, я с удовольствием его дам.
Я забыл добавить: я выполнил консольную печать прямо перед тем, как расшифровать и зашифровать пакет, чтобы посмотреть, что является общедоступным и частнымключи предназначены для шифрования и дешифрования определенного пакета.Насколько я мог видеть, отпечатки идентичны, но кажется возможным, что какой-то бит будет отличаться из-за кодирования, а я его не вижу.
Исключение, которое выдается при попытке расшифровки:Неверный параметр.