2012-06-19 36 views
1

我問安全網站this問題,那裏的人建議我應該在這裏發佈它。這封加密郵件爲什麼被損壞?

一些背景。我們擁有專有的設備,它運行在專有的操作系​​統上的c以及其他通過windows操作系統運行c#dll的設備上。 兩者都通過TCP連接與我們的服務器聯繫,對於我們的服務器,兩種請求類型都是相同的。 TCP服務器通過http綁定將部分請求傳輸到自託管的WCF服務。 請求被加密,如鏈接所示(如C#dll加密它們)。

我正在嘗試切斷TCP服務器並直接向WCF服務發送請求。

我的問題是,它似乎像WCF服務收到請求字符串錯了,它不能解密它。

似乎在服務器端接收字符串中還有其他\ t \ n。除了它看起來一樣。

這是在服務器端解密代碼:

  byte[] byteChiperText = Encoding.Default.GetBytes(input); 

      if (k.Length != 16) 
      { 
       throw new Exception("Wrong key size exception"); 
      } 
      TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider(); 

      des.Mode = CipherMode.ECB; 
      des.Padding = PaddingMode.Zeros; 
      des.Key = k; 
      ICryptoTransform ic = des.CreateDecryptor(); 
      MemoryStream ms = new MemoryStream(byteChiperText); 
      CryptoStream cStream = new CryptoStream(ms, 
       ic, 
       CryptoStreamMode.Read); 
      StreamReader sReader = new StreamReader(cStream); 
      byte[] data = new byte[byteChiperText.Length]; 
      int len = sReader.BaseStream.Read(data, 0, data.Length); 
      output = Encoding.Default.GetString(data, 0, len); 

      cStream.Close(); 

回答

6

嗯,這看起來破入手:

byte[] byteChiperText = Encoding.Default.GetBytes(input); 

你處理加密的數據,如果是文本編碼與平臺默認編碼。這是丟失數據的好方法。加密數據不是文本。這是任意的二進制數據,應該這樣對待。

取而代之,您應該使用base64將加密數據編碼爲文本(Convert.ToBase64String),然後稍後反轉(Convert.FromBase64String)以返回原始密碼文本。當然,假設你需要以文本形式開始。如果你首先可以通過它作爲byte[],那會更好。

另請注意,您將文本取出的方法有點奇怪 - 您正在創建StreamReader,然後僅使用基本流。這將是更好地使用:

// You should be using "using" statements for all your streams, by the way... 
using (TextReader reader = new StreamReader(cStream)) 
{ 
    output = reader.ReadToEnd(); 
} 

注意,這將使用UTF-8,而不是平臺默認的編碼 - 但這是一個的事情,只要你做的加密代碼的相應變化。使用平臺默認編碼幾乎總是一個錯誤 - 它可能不支持所有的Unicode,並且每個機器都有所不同。

+0

我認爲編碼可能是一個問題,但我擔心改變這可能會導致我們的專有設備的請求停止工作 – Mithir

+0

另一個問題,它真的是關於默認編碼?正如我所提到的那樣,加密的文本在發送之前看起來是一種方式,而在發送之後則是另一種。沒有使用編碼,只是發送到服務 - 它仍然會改變... – Mithir

+0

你可能將它看作*文本* - 但它不是文本。只要您將字節數組(加密輸出)編碼爲文本,您就會丟失數據 - 我假設您也使用'Encoding.Default'處理數據。它的部分原因在於你使用的是Encoding.Default,部分原因是你使用的是編碼*。你根本就不應該那樣做。我不知道你的「專有設備請求」是什麼樣的,但是如果他們對加密數據進行任何類似於Encoding.Default的處理,他們將會丟失信息。 –

2

的問題可能是Encoding.Default,因爲:

不同的計算機可以使用不同的編碼爲默認值。

您應該使用給定的標準編碼(UTF-8,UTF-16,..)。

相關問題