0

我正在用 C# 编写一个应用程序,它需要解密一些由一些旧软件加密的数据。遗留代码以 8 个为一组循环遍历未加密的字节,并在 CBC 模式下通过 TripleDES 对它们进行加密。然后,它使用 TripleDES CFB 处理剩余字节,使用剩余量的块大小(在此特定情况下为 2)。

我可以使用 System.Security.Cryptography.TripleDES 在 C# 中对第一阶段的数据进行解密,因为它允许块大小为 64 位(8 字节)。然而,TripleDES 类不允许16 位的块大小。以下代码会引发错误,提示“指定的块大小对此算法无效”:

TripleDES provider = TripleDESCryptoServiceProvider.Create();
provider.Mode = CipherMode.CFB;
provider.BlockSize = 16; // exception thrown here

我假设这是由于小块大小的弱性质而存在的。不幸的是,这就是我所坚持的。是否有任何免费的第三方库可能支持 TripleDES/CFB 的 16 位块大小?或者我可以在这个数据集上使用什么技巧来完成这项工作?我检查了 DES 类,看它是否支持 16 位块大小,但没有骰子......

我不是密码学专家,所以如果我最终不得不为 TripleDES 编写自己的代码(超过 2 个字节......grrr),任何关于算法细节的直截了当的文章都会非常有帮助。

4

2 回答 2

2

一种可能性是明文的最后两个字节与最终加密密码块的两个字节简单地异或,其余部分被丢弃。使用 .NET 类来获得这种行为应该足够简单。

  1. 将块大小设置为 64 位。
  2. 将模式设置为 CFB。
  3. 将反馈大小设置为 64 位
  4. 将输入填充为 8 个字节的倍数。使用什么填充并不重要,因为您将丢弃额外的数据。
  5. 变换方块。
  6. 扔掉残留物。
于 2012-06-28T23:38:47.440 回答
0

虽然 MSDN 说您可以通过该属性设置块大小,但我认为不可能为 3DES 设置 16 位块大小,因为创建 DES(和 3DES)仅使用 64 位块。

我猜想遗留软件使用一些填充方案来加密最后一个块。通常它用随机值填充剩余的字节,并将这些不需要的字节数保存到最后一个字节。

于 2012-06-28T14:14:33.597 回答