Асимметричная расшифровка сбоя по TCP-соединению, по-видимому, из-за проблем с кодированием - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь обменяться открытыми ключами по 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.Я пропустил этот код, потому что я подумал, что мой макет уже был достаточно длинным, и я не хочу кого-либо перегружать.Если вам нужен исходный исходный код проекта, я с удовольствием его дам.

Я забыл добавить: я выполнил консольную печать прямо перед тем, как расшифровать и зашифровать пакет, чтобы посмотреть, что является общедоступным и частнымключи предназначены для шифрования и дешифрования определенного пакета.Насколько я мог видеть, отпечатки идентичны, но кажется возможным, что какой-то бит будет отличаться из-за кодирования, а я его не вижу.

Исключение, которое выдается при попытке расшифровки:Неверный параметр.

...