Encryption 密钥大小增加三倍-.NET与Wikipedia

Encryption 密钥大小增加三倍-.NET与Wikipedia,encryption,wikipedia,des,tripledes,Encryption,Wikipedia,Des,Tripledes,根据,TripleDES支持56、112和168位密钥长度,但System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes表示它只接受128和192位密钥长度 我正在开发的系统需要具有互操作性(由我的代码加密的数据需要能够在PHP、Java和Objective-C中解密),在这种情况下,我不知道谁是正确的 那么我该相信谁呢?我怎样才能确保我的加密数据是可移植的?Triple-DES将只使用128/192位密钥中的112/168位

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

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


那么我该相信谁呢?我怎样才能确保我的加密数据是可移植的?

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


56位DES坏了,我想他们会让它更难使用。

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

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

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

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

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

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

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


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

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

因此,des总是运行奇数次

这也是为什么永远不要选择64位部分重复的键


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

三天内查看了无用的示例,然后这个答案帮助我认识到.Net如何支持128位密钥,而CCCrypt函数强制您使用192bit。。。它将128位中的前64位复制到末尾,因此K3=K1。iOS C#.Net互操作性。很简单。最近,但是:DES的定义为(奇数)奇偶校验保留了密钥每个字节的低位;在20世纪70年代,加密是在专用的离散硬件中完成的,并且比特错误是一种真正的可能性。今天,几乎所有的软件或固件中都有一些实现忽略了奇偶校验,有些仍然检查它的兼容性;我不知道哪个是点网(或CAPI)。对于键值,ASCII不应被假定或要求,而且肯定与定义无关。。。。。。此外,EDE和EEE都是在20世纪90年代考虑的,当时显然需要对DES进行“增强”,但只有EDE是标准化的,我会非常惊讶地发现今天有任何实现都在进行EEE。@dave_thompson_085感谢您对EDE标准化的澄清。在奇偶校验位上,如果软件实现(转换为可能的硬件实现)取每个提供字节的上7位,而下7位有更多的熵(如果直接提供加密密码——如果可能是愚蠢的话),这将是非常糟糕的。我认为最明智的做法是保留每个字节的低位7位,并将其移动