C#TripleDes的供应商没有初始化向量?(C# TripleDES Provider with

2019-07-31 19:07发布

我有一组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)。

到底关键是要确保你有从加密的数据提供者的所有信息

Answer 1:

试图回答每个点:

  • 初始化向量是必需的CBC模式。 它不需要是个秘密(不像键),所以它应该从远程系统发送。
  • 因为你需要的IV,null不是通过正确的事情。
  • 填充模式。 你需要知道哪些填充模式下使用。
  • TransformFinalBlock可能失败,因为填充模式是错误的。

编辑

ECB(电子码本)和CBC(密码块链接)之间的差异如下所示:

正如你所看到的没有IV在ECB模式下使用。 所以,即使你提供一个它会被忽略。



文章来源: C# TripleDES Provider without an Initialization Vector?
标签: c# tripledes