我问安全网站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的处理,他们将会丢失信息。 –