2012-06-19 35 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,..)。

相关问题