【发布时间】: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