我問安全網站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();
我認爲編碼可能是一個問題,但我擔心改變這可能會導致我們的專有設備的請求停止工作 – Mithir
另一個問題,它真的是關於默認編碼?正如我所提到的那樣,加密的文本在發送之前看起來是一種方式,而在發送之後則是另一種。沒有使用編碼,只是發送到服務 - 它仍然會改變... – Mithir
你可能將它看作*文本* - 但它不是文本。只要您將字節數組(加密輸出)編碼爲文本,您就會丟失數據 - 我假設您也使用'Encoding.Default'處理數據。它的部分原因在於你使用的是Encoding.Default,部分原因是你使用的是編碼*。你根本就不應該那樣做。我不知道你的「專有設備請求」是什麼樣的,但是如果他們對加密數據進行任何類似於Encoding.Default的處理,他們將會丟失信息。 –