[英]Sending encrypted data via TCP (“Bad Data” exception)
如何將非法字符從 tpc 客戶端發送到 tcp 服務器。 這是加密亂碼的示例:
https://i.stack.imgur.com/wfZdm.png
我如何將這些亂碼發送到我的客戶端或服務器?
這是我的加密和解密代碼
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[]
緩沖區,並將其直接傳遞給您正在使用的Socket
、 TcpClient
或NetworkStream
。 不過,您需要定義一個帶有長度前綴的二進制協議。 Encoding.ASCII.GetBytes
會將String data
實例中的 UTF-16LE 編碼字符轉換為 7 位 ASCII, 它通過將值高於0x7F
的字符替換為'?'
-這不是你想要的! (這就是導致屏幕上出現垃圾 output 的原因:那些“非法字符”是0x7F
以上的字節值,超出了 ASCII 的 7 位范圍。從文檔中:
它使用替換回退來用問號(“?”)字符替換無法編碼的每個字符串和無法解碼的每個字節。
如果您確實想使用人類可讀的文本通過網絡傳輸數據,請使用 Base64 編碼: Convert.ToBase64String( Byte[] buffer )
並在接收端使用Convert.FromBase64String( String s )
將其轉換回來 - 但你'仍然需要對數據進行長度前綴或分隔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.