Отправка зашифрованных данных через TCP (исключение «неверные данные») - PullRequest
0 голосов
/ 21 апреля 2020

Как я могу отправить нелегальные персонажи с tp c клиента на tcp сервер. Это пример того, как выглядит зашифрованный гиббери sh:

https://i.stack.imgur.com/wfZdm.png

Как я могу отправить этот кусок гиббери sh любому моему клиент или сервер?

Это мой код шифрования и дешифрования

public static string Decrypt(string data)
        {
            byte[] dataToDecrypt = StringToByteArray(data);

            byte[] decryptedData;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.FromXmlString(privateKey);
                decryptedData = rsa.Decrypt(dataToDecrypt, false);
            }

            UnicodeEncoding byteConverter = new UnicodeEncoding();
            return ByteArrayToString(decryptedData);
        }

        public static string Encrypt(string data, string publicKey)
        {
            UnicodeEncoding byteConverter = new UnicodeEncoding();
            byte[] dataToEncrypt = StringToByteArray(data);

            byte[] encryptedData;
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
            {
                rsa.FromXmlString(publicKey);
                encryptedData = rsa.Encrypt(dataToEncrypt, false);
            }
            return ByteArrayToString(encryptedData);
        }


public static byte[] StringToByteArray(string data)
        {
            return Encoding.ASCII.GetBytes(data);
        }

        public static string ByteArrayToString(byte[] bytes)
        {
            return Encoding.ASCII.GetString(bytes);
        }

Я сделал так, чтобы клиент и сервер совместно использовали ключи друг друга, публикуемые c, но я получаю исключение "Плохо" данные". Еще одна вещь, если я отправляю зашифрованные данные с клиента на сервер, размер которого составляет 128 байт, сервер получает только 78 байт, например

1 Ответ

1 голос
/ 21 апреля 2020

В вашем коде есть несколько ошибок:

  • Вам вообще не следует использовать String.
    • String предназначено для текста, а не произвольных двоичных данных (я полагаю, вы получили это впечатление от C или PHP, где их строковые типы на самом деле являются просто синонимами для - или тонких оболочек - над byte-array).
  • Сохраните буфер Byte[], полученный из rs.Encrypt, и передайте его непосредственно в Socket, TcpClient или NetworkStream, который вы с помощью. Вам нужно определить двоичный протокол с префиксом длины.
  • Encoding.ASCII.GetBytes преобразует символы в кодировке UTF-16LE в экземпляре String data в 7-битный ASCII, он делает это, заменяя символы со значениями выше 0x7F на '?' - это не то, что вам нужно! (и это то, что вызывает вывод мусора на ваш экран: эти "незаконные" символы "- это байтовые значения выше 0x7F, которые находятся за пределами 7-битного диапазона ASCII. Из документации:

    Он использует запасной запасной вариант для замены каждой строки, которую он не может кодировать, и каждого байта, который он не может расшифруйте его с помощью знака вопроса («?»).

  • Если вы действительно хотите передавать данные по сети, используя читаемый текст, используйте кодировку Base64: Convert.ToBase64String( Byte[] buffer ) и преобразовать его обратно, используя Convert.FromBase64String( String s ) на принимающей стороне, но вам все равно потребуется префикс длины или разделение ваших данных.

...