C# 通过TCP发送加密数据(“;坏数据”;异常)
如何将非法字符从tpc客户端发送到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
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
用于文本,而不是任意的二进制数据(我假设您是从C或PHP中得到这种印象的,它们的字符串类型实际上只是字节数组的同义词或精简包装器)String
- 保留从
获得的rs.Encrypt
缓冲区,并将其直接传递到您正在使用的Byte[]
、套接字
或TcpClient
。不过,您需要定义一个带有长度前缀的二进制协议网络流
将Encoding.ASCII.GetBytes
实例中的UTF-16LE编码字符转换为7位ASCII,使用字符串数据
-这不是您想要的(这就是导致屏幕上出现垃圾输出的原因:这些“非法字符”是“?”
以上的字节值,超出了ASCII的7位范围。从文档中可以看出: 它使用替换回退将无法编码的每个字符串和无法解码的每个字节替换为问号(“?”)字符0x7F
- 如果确实希望使用人类可读文本通过网络传输数据,请使用Base64编码:
并在接收端使用Convert.ToBase64String(Byte[]buffer)
将其转换回-但仍然需要长度前缀或分隔数据Convert.FromBase64String(String s)
random
类有一个方法可以做到这一点)并传输它们。字节可能是有效文本,也可能不是有效文本,但它们肯定是“乱七八糟的”。确切地说,您是如何将字符串发送到套接字的?在进行网络编程时,您应该只使用字节[]
缓冲区。