簡體   English   中英

通過 TCP 發送加密數據(“Bad Data”異常)

[英]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[]緩沖區,並將其直接傳遞給您正在使用的SocketTcpClientNetworkStream 不過,您需要定義一個帶有長度前綴的二進制協議。
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM