gpt4 book ai didi

没有初始化向量的 C# TripleDES 提供程序?

转载 作者:太空狗 更新时间:2023-10-29 18:29:34 26 4
gpt4 key购买 nike

我有一组来自远程系统的用 TripleDES 编码的加密文档。我需要在 C# 中解码数据,但我无法控制 key 或编码算法。我所拥有的只是 key 和模式 (CBC) 以及文件中的数据。

TripleDESCryptoServiceProvider 很容易使用,但我不知道如何在没有初始化向量的情况下使用解密器。

我们有一个 24 字节(192 位)的 key 来解密,但没有别的。

   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);

所以问题是:

  • 如果我只有一个 key ,是否需要 InitializationVector?
  • 如果不是 null 是否正确?
  • 除了 key 和模式之外,我还可能需要设置什么?
  • 为什么 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 和 Padding。修复填充使得 TransformFinalBlock() 工作时没有Bad Data 错误。修复 CipherMode 可以正确地解密数据。

故事的寓意:在 CipherMode.ECB 模式下至少有一个初始化向量,您不需要提供初始化向量。如果没有提供 IV,提供者将自动生成一个,但解密仍然有效(至少对于 ECB)。

最后,确保您拥有来自加密数据的提供商的所有信息是至关重要的。

最佳答案

尝试回答每一点:

  • CBC 模式需要初始化向量。它不需要是 secret 的(与 key 不同),因此它应该从远程系统发送。
  • 由于您需要 IV,null 不是正确的传递方式。
  • 填充模式。您需要知道使用的是哪种填充模式。
  • TransformFinalBlock 可能失败,因为 Padding 模式错误。

编辑

ECB (Electronic Code Book) 和 CBC (Cipher Block Chaining) 的区别如下图所示:

ECB Mode

CBC Mode

如您所见,在 ECB 模式下没有使用 IV。因此,即使您提供了一个,它也会被忽略。

关于没有初始化向量的 C# TripleDES 提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12522191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com