6

根据维基百科,TripleDES 支持 56、112 和 168 位密钥长度,但 System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes 表示它只接受 128 和 192 位密钥长度。

我正在开发的系统需要可互操作(由我的代码加密的数据需要在 PHP、Java 和 Objective-C 中可解密),在这种情况下我不知道谁是正确的。

那我应该相信谁?我如何确保我的加密数据是可移植的?

4

4 回答 4

13

维基百科没有说 TripleDES 支持 56 位密钥。“密钥选项”谈论“三倍长度”密钥和“双倍长度”密钥,后者“将密钥大小减少到 112 位”。原始 DES 的有效密钥大小为 56 位。但是,这样的密钥是由 64 位输入构造的,其中 8 位未使用。因此,“三倍长度”密钥选项适用于由三倍 64 位(=192 位)构造的三倍 56 位(=168),而“双倍长度”选项适用于两倍 56 位密钥(=112)由两次 64 位 (=128) 构成。

由于您的 TripleDESCryptoServiceProvider 需要首先从基于 64 位的输入中派生实际密钥,因此它只需要 128 位(双倍长度)或 192 位(三倍长度)作为输入,然后在内部派生 168 位或 112 位实际来自该输入的键。

这是 TripleDES 的标准程序,因此跨平台的可移植性应该没有问题。

于 2011-07-20T18:08:21.797 回答
0

Des 使用 64 位密钥的倍数,但丢弃了 8 位,留下了 64 位的有用密钥长度。
Triple des 可以使用双倍或三倍密钥长度。
但是,因为使用相同的密钥重复 des 会解密运行 des 偶数次的消息,如果密钥共享模式,则可以部分解密内容。

因此,des 总是运行奇数次。

这也是为什么您永远不应该选择重复 64 位部分的密钥的原因。

使用 Triple des 192 位,您因此拥有 112 位的有效密钥长度

于 2011-07-20T18:35:57.213 回答
0

三重 DES 将仅使用 128/192 位密钥的 112/168 位。.NET 要求更多位用于对齐(每个 56 位子键在 64 位边界上对齐)。

56 位 DES 坏了,我希望它们使它更难使用。

于 2011-07-20T18:07:38.363 回答
0

我相信 DES 的某些(全部?)实现仅使用每个密钥字符 7 位(ASCII 编码)。我不确定 DES 的定义是否允许密钥中的 8 位字符,或者它是否实际上忽略了每个字节的高位。我认为是后者。

但是,在 .NET 中,密钥大小基于字节数乘以每字节 8 位,即使底层算法忽略了最高位。这可能是主要的差异。

TripleDES 使用三个不同的 56 位 DES 密钥运行 DES 三次。在一些实现中,中间运行是相反的(加密-解密-加密或“EDE”),因此对所有三个使用相同的 56 位 DES 密钥会复制简单 DES 的加密。这样做是为了与两者都使用基于硬件的加密的旧系统兼容。我不确定 TripleDESCryptoServiceProvider 是使用这种“EDE”方法还是“EEE”方法(或给你一个选择)。此外,相同的 56 位 DES 密钥可用于第一次和第三次运行,使用 112 位密钥而不是它也可以使用的 168 位密钥。

经过认证的 TripleDESCryptoServiceProvider 不接受 56 位(64 位)密钥,因为它不是真正的 3DES 安全性(您可以改用 DESCryptoServiceProvider 吗?)。曾经确定 168 位 EEE(或 EDE?)3DES 不提供比使用 112 位(128 位)密钥更高的安全性。但是,可能存在一些极端(通常不可用)的攻击,其中较短的密钥理论上更容易受到攻击。这也可能适用于 EDE 与 EEE 的问题。

关于与其他语言的兼容性问题,.NET 的 *CryptoServiceProvider 类只是底层 Windows CRYPTO 库的包装 API。如果其他语言也使用 Windows CRYPTO 库,它应该是兼容的。否则,您必须确定他们使用的是 EDE 还是 EEE,并确保所有人都使用相同的(您可能对此有灵活性也可能没有),并且显然使用相同的密钥长度。它们可能都使用相同的字节顺序,但是如果您发现仍然不匹配,则可能需要检查另一件事。最有可能在 Windows 上,它们都使用 CRYPTO,并且可能会匹配,只要您可以为所有选项设置相同的选项。

于 2011-07-20T18:08:32.017 回答