【问题标题】:16-bit Block Size on TripleDES CFB in C#C# 中 TripleDES CFB 上的 16 位块大小
【发布时间】:2012-06-28 14:02:44
【问题描述】:

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

我可以使用 System.Security.Cryptography.TripleDES 在 C# 中对第一阶段的数据进行解密,因为它允许 64 位(8 字节)的块大小。但是,TripleDES 类不会允许 16 位的块大小。下面的代码会抛出一个错误,提示“Specified block size is not valid for this algorithm”:

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

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

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

【问题讨论】:

  • 没有块大小为 2 的块密码。你有问题。
  • @usr 完全有可能。旧代码正在使用无法在 C# 中运行的第三方库。对于算法的“剩余部分”,它告诉这个库使用 2(字节)的块大小,然后传入两个字节并接收两个字节的结果。根据我在下面对 Ivan 的回复中提到的推理,我假设它不使用一些隐式填充。为了安全起见,我在 C# 中尝试了 64 位块大小以及所有可用的填充类型,但没有收到预期的结果。
  • DES 未在此类块大小上定义。填充与块大小不同。您无法根据自己的喜好调整块大小。它被烧入算法中。
  • 您需要了解如何使用 CFB (en.wikipedia.org/wiki/…)。我不了解自己,但我知道这就是你所需要的。
  • 你确定密码模式是普通CFB而不是CFB+OFB的组合吗?后者确实允许 AFAIR 拥有与纯文本一样长的密文(无填充)。

标签: c# encryption tripledes


【解决方案1】:

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

  1. 将块大小设置为 64 位。
  2. 将模式设置为 CFB。
  3. 将反馈大小设置为 64 位
  4. 将输入填充为 8 字节的倍数。使用什么填充并不重要,因为您将丢弃额外的数据。
  5. 转换方块。
  6. 扔掉残留物。

【讨论】:

  • 这让我成功了一半。使用这种方法,第一个字节似乎每次都能正确解密,但第二个字节仍然没有排队。为了以防万一,我尝试了各种填充方案,但似乎都没有产生影响。我的测试代码和你的布局之间的唯一区别是我必须将反馈设置为 8 位,因为否则我会收到一个异常(也就是说它必须是 8 位)。关于第二个(也是最后一个)字节可能发生什么的任何想法?
  • @iddqd:我真的不知道,抱歉。
【解决方案2】:

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

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

【讨论】:

  • 嗯,遗留加密的结果是总共 26 个字节。所以它从“标准”方法中吐出三个 8 字节块,然后从其“剩余方法”中吐出一个 2 字节块。如果它在 2 字节块上进行填充,它不会将其填充到 8 个字节,因此算法的该部分有一个 8 字节的结果,导致总共 32 个字节(24+8)而不是26(24+2)?根据我对这些分组密码的了解,它们总是返回与输入具有相同块大小的结果,对吧?如果在幕后添加填充,哪个会包括填充?
  • 还有CTS(密文窃取)加密模式,产生与明文长度相同的密文。它处理最后两个块的方式与其他块不同(使用 CBC 或 ECB 加密)。 CipherMode 枚举具有使用 CBC 的 CTS 成员,可能是您需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多