Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过TCP发送加密数据(“;坏数据”;异常)_C#_Encryption_Encoding_Tcp_Decoding - Fatal编程技术网

C# 通过TCP发送加密数据(“;坏数据”;异常)

C# 通过TCP发送加密数据(“;坏数据”;异常),c#,encryption,encoding,tcp,decoding,C#,Encryption,Encoding,Tcp,Decoding,如何将非法字符从tpc客户端发送到tcp服务器。 这是加密的胡言乱语的一个示例: 我怎样才能把这些胡言乱语发送到我的客户机或服务器 这是我的加密和解密代码 public static string Decrypt(string data) { byte[] dataToDecrypt = StringToByteArray(data); byte[] decryptedData; using (RSACr

如何将非法字符从tpc客户端发送到tcp服务器。 这是加密的胡言乱语的一个示例:

我怎样才能把这些胡言乱语发送到我的客户机或服务器

这是我的加密和解密代码

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);
        }

我已经这样做,使客户端和服务器共享彼此的公钥,但我得到异常“坏数据”。还有一件事,如果我将加密数据从客户端发送到服务器(数据为128字节),服务器只接收78字节,例如,您的代码有一些问题:

  • 您根本不应该使用
    String
    • String
      用于文本,而不是任意的二进制数据(我假设您是从C或PHP中得到这种印象的,它们的字符串类型实际上只是字节数组的同义词或精简包装器)
  • 保留从
    rs.Encrypt
    获得的
    Byte[]
    缓冲区,并将其直接传递到您正在使用的
    套接字
    TcpClient
    网络流
    。不过,您需要定义一个带有长度前缀的二进制协议
  • Encoding.ASCII.GetBytes
    字符串数据
    实例中的UTF-16LE编码字符转换为7位ASCII,使用
    “?”
    -这不是您想要的(这就是导致屏幕上出现垃圾输出的原因:这些“非法字符”是
    0x7F
    以上的字节值,超出了ASCII的7位范围。从文档中可以看出:

    它使用替换回退将无法编码的每个字符串和无法解码的每个字节替换为问号(“?”)字符

  • 如果确实希望使用人类可读文本通过网络传输数据,请使用Base64编码:
    Convert.ToBase64String(Byte[]buffer)
    并在接收端使用
    Convert.FromBase64String(String s)
    将其转换回-但仍然需要长度前缀或分隔数据


TCP中没有“非法字符”。事实上,TCP根本不关心文本编码。我想你误解了文本编码的作用。我已经这样做了,所以客户端和服务器彼此共享公钥,但我得到了异常“坏数据”。还有一件事,如果我从客户端向服务器发送加密数据,例如数据为128字节,服务器只接收78字节。不清楚你在问什么。如果你想发送“胡言乱语”,是什么阻止了你?为什么不选择一些随机字节(方便地说,.NET
random
类有一个方法可以做到这一点)并传输它们。字节可能是有效文本,也可能不是有效文本,但它们肯定是“乱七八糟的”。确切地说,您是如何将
字符串发送到
套接字的?在进行网络编程时,您应该只使用
字节[]
缓冲区。