TripleDES 密钥大小 - .NET 与 Wikipedia
根据 Wikipedia,TripleDES 支持 56 位、112 位和 168 位密钥长度,但 System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes说它只接受 128 位和 192 位密钥长度。
我正在开发的系统需要具有互操作性(由我的代码加密的数据需要能够在 PHP、Java 和 Objective-C 中解密),但我不知道在这种情况下谁是正确的。
那么我该相信谁呢?我如何确定我的加密数据是可移植的?
According to Wikipedia, TripleDES supports 56, 112, and 168-bit key lengths, but the System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes says it only accepts 128 and 192-bit key lengths.
The system I'm developing needs to be interoperable (data encrypted by my code needs to be decryptable in PHP, Java, and Objective-C) and I don't who is correct in this case.
So who should I believe? And how can I be sure my encrypted data is portable?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
维基百科没有说 TripleDES 支持 56 位密钥。 “密钥选项”谈论“三倍长度”密钥和“双倍长度”密钥,后者“将密钥大小减少到 112 位”。
原始 DES 的有效密钥大小是 56 位。然而,这样的密钥是根据 64 位输入构建的,其中 8 位保持未使用。因此,“三倍长度”密钥选项适用于由三倍 64 位(= 192 位)构造的三倍 56 位密钥(= 168),“双倍长度”选项适用于两倍 56 位密钥(= 112)由两倍 64 位 (=128) 构成。
由于您的 TripleDESCryptoServiceProvider 需要首先从基于 64 位的输入派生实际密钥,因此它将仅采用 128 位(双倍长度)或 192 位(三倍长度)作为输入,然后在内部派生 168 或 112 位实际密钥来自该输入的键。
这是 TripleDES 的标准过程,因此跨平台的可移植性应该没有问题。
Wikipedia does not say TripleDES supports 56 bit keys. The "keying options" talk about "triple-length" keys and "double-length" keys, the latter "reduces the key size to 112 bits".
The effective key size for the original DES is 56 bit. Such a key is constructed from 64 bit input though, where 8 bits remain unused. The "triple-length" key option thus works with a three times 56 bit (=168) constructed from three times 64 bit (=192 bit) and the "double-length" option works with two times 56 bit keys (=112) constructed from two times 64 bit (=128).
As your TripleDESCryptoServiceProvider needs to derive the actual keys from the 64 bit-based input first, it will only take either 128 bits (double-length) or 192 bits (triple-length) as input and then internally derive the 168 or 112 bit actual keys from that input.
That's standard procedure for TripleDES, so you should have no problems with portability across platforms.
三重 DES 将仅使用 128/192 位密钥中的 112/168 位。 .NET 需要更多位来实现对齐(每个 56 位子项在 64 位边界上对齐)。
56 位 DES 已被破坏,我希望他们让它变得更难使用。
Triple DES will only use 112/168 bits of your 128/192 bit key. .NET asks for more bits for the purpose of alignment (each 56 bit subkey is aligned on a 64 bit boundary).
56 bit DES is broken and I'd expect they've made it harder to use.
我相信 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,并且只要您能够以相同的方式为所有它们设置选项,它们就可能会匹配。
I believe some (all?) implementations of DES use only 7 bits per character of the key (ASCII encoding). I'm not sure if the definition of DES allows for 8-bit characters in keys or if it actually ignores the high bit of each byte. I think it's the latter.
However, in .NET key sizes are based on the number of bytes, times 8 bits per byte, even if the underlying algorithm ignores that top bit. That is probably the main discrepancy.
TripleDES runs DES three times with potentially three different 56-bit DES keys. In some implementations the middle run is reversed (encrypting-decrypting-encrypting or "EDE") so that using the same 56-bit DES key for all three duplicates the encryption of simple DES. This was done for compatibility with older systems where both are using hardware-based encryption. I'm not sure if the TripleDESCryptoServiceProvider uses this "EDE" approach or the "EEE" approach (or gives you a choice). Further, the same 56-bit DES key can be used for the first and third run, using a 112-bit key instead of the 168-bit key it could also use.
The certified TripleDESCryptoServiceProvider wouldn't accept 56-bit (64-bit) keys because it's not really 3DES security (you could use DESCryptoServiceProvider instead?). At one time it was determined that the 168-bit EEE (or EDE?) 3DES does not provide any greater security than using a 112-bit (128-bit) key. However, there may be some extreme (generally unavailable) attacks in which the shorter key is theoretically more vulnerable. That may also apply to the EDE vs EEE question.
On your compatibility vs other languages question, .NET's *CryptoServiceProvider classes are just a wrapper API around the underlying Windows CRYPTO library. If the other languages are also using the Windows CRYPTO library it should be compatible. Otherwise, you'd have to find out whether they are using EDE or EEE and make sure all are using the same one (you may or may not have flexibility on that), and obviously use the same key length. They are probably all using the same byte order, but if you find things still don't match up that might be another thing to check. Most likely on Windows they're all using CRYPTO and will probably match up as long as you can set the options the same way for all of them.
Des 使用多个 64 位密钥,但丢弃 8 位,留下 64 位的有用密钥长度。
Triple des 可以使用双倍或三倍密钥长度。
然而,因为使用相同的密钥重复 des 会解密消息,如果密钥共享模式,运行 des 偶数次可以部分解密内容。
因此 des 总是运行奇数次。
这也是为什么您永远不应该选择 64 位部分重复的密钥的原因。
通过 Triple des 192 位,您的有效密钥长度为 112 位
Des uses multiples of 64 bit keys, but throws away 8 bits leaving a useful keylength of 64 bits.
Triple des can use double or triple key length.
However because repeating des with the same key decrypts the message running des an even number of times can partially decrypt stuff if the keys share patterns.
For this reason des is always ran an odd number of times.
This is also why you should never choose a key where 64 bit parts repeat.
With triple des 192 bit you thus have a effective key length of 112 bits