我有一组TripleDes的从远程系统未来的编码加密文件。 我需要在C#中的数据进行解码和我有过键或编码算法没有控制权。 我所有的关键和模式(CBC)和位于文件中的数据。
该TripleDESCryptoServiceProvider是很容易使用,但我无法弄清楚如何使用解密没有初始化向量。
我们有一个有24字节(192bit的)键与解密,但没有别的。
string key = "1468697320656E6372797174696F6E206973737265206933";
byte[] keyData = ParseHex(key); // key is OK at 24 bytes
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Mode = CipherMode.CBC;
des.GenerateIV();
var decryptor = des.CreateDecryptor(keyData,null); // des.IV
var encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");
byte[] output = decryptor.TransformFinalBlock(encoded, 0, encoded.Length);
这种不良的数据完全失败。 如果我切换到TransformBlock至少运行的代码,但只产生乱码:
byte[] output = new byte[10000];
var count = decryptor.TransformBlock(encoded, 0, encoded.Length, output, 0);
所以,问题是:
- 如果我只有一个键所需的InitializationVector?
- 如果不为null正确的事情通过?
- 还有什么会我可能需要设置超出键和模式?
- 为什么TransformBlock至少工作和TransformFinalBlock只是失败?
更新 - 发现问题
原来,解码问题引起的,而不是由丢失的初始化向量,但通过加密数据的提供者不正确的信息。 更新后的工作代码如下所示:
// Read the test data
byte[] encoded = File.ReadAllBytes(@"..\..\..\..\test.tdes");
// Get the key into a byte array
string key = "1468697320656E6372797174696F6E206973737265206933";
byte[] keyData = ParseHex(key);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Mode = CipherMode.ECB; // Make sure this is correct!!!
des.Padding = PaddingMode.Zeros; // Make sure this is correct!!!
des.Key = keyData;
var decryptor = des.CreateDecryptor();
byte[] output = decryptor.TransformFinalBlock(encoded, 0, encoded.Length);
string dataString = Encoding.Default.GetString(encoded);
Console.WriteLine(dataString);
Console.WriteLine("\r\n\r\nDecoded:");
string result = Encoding.Default.GetString(output);
Console.WriteLine(result);
Console.Read();
使用适当的CipherMode和填充在我们的情况下,关键是。 固定制造TransformFinalBlock()工作无不良数据出现错误的填充。 固定作出正确CipherMode未加密的数据。
这个故事的寓意:在CipherMode.ECB模式至少一个初始化向量你不需要提供一个初始化向量。 如果没有IV提供的供应商将自动生成一个,但解密仍然有效(至少ECB)。
到底关键是要确保你有从加密的数据提供者的所有信息 。