2011-07-20 35 views
6

根據Wikipedia,TripleDES支持56,112和168位密鑰長度,但System.Cryptography.TripleDESCryptoServiceProvider.LegalKeySizes說它只接受128和192位密鑰長度。TripleDES密鑰大小--NET vs維基百科

我正在開發的系統需要互操作(通過我的代碼加密的數據需要在PHP,Java和Objective-C中解密),在這種情況下,我並不認爲誰是正確的。

那我該相信誰呢?我怎樣才能確保我的加密數據是可移植的?

回答

13

維基百科沒有說TripleDES支持56位密鑰。 「密鑰選項」提到「三倍長度」密鑰和「雙倍長度」密鑰,後者「將密鑰大小減少到112位」。 原始DES的有效密鑰大小是56位。這樣的密鑰由64位輸入構成,其中8位保持不用。因此,「三倍長度」密鑰選項與由三次64位(= 192位)構成的三次56位(= 168)一起使用,而「雙倍長度」選項與兩次56位密鑰(= 112)由兩個64位(= 128)構成。

由於您的TripleDESCryptoServiceProvider需要首先從64位輸入中導出實際的密鑰,因此它只會採用128位(雙倍長度)或192位(三倍長度)作爲輸入,然後在內部導出168或來自該輸入的112位實際密鑰。

這是TripleDES的標準程序,所以您應該在跨平臺的可移植性方面沒有問題。

+0

三看無用的例子天有效密鑰長度那麼這個答案使我認識的.Net如何支持128位的密鑰和CCCrypt功能逼你到192bit的。它將128位的前64位複製到最後,所以K3 = K1。 C#.Net互操作性iOS <->很簡單。 –

0

三重DES將只使用您的128/192位密鑰的112/168位。 .NET爲了對齊的目的而要求更多的位(每個56位子鍵在64位邊界上對齊)。

56位DES壞了,我期望他們使它更難使用。

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,並且可能會匹配,只要您可以爲所有選項設置相同的選項。

+0

遲了,但:DES的定義保留(奇數)奇偶校驗密鑰的每個字節的*低*位;在20世紀70年代,加密技術是在專用的分立硬件中完成的,而誤碼是一種真正的可能性。今天幾乎所有的軟件或固件都有一些實現忽略了奇偶校驗,有些實現仍然檢查它是否具有兼容性;我不知道哪個dot-NET(或CAPI)會。對於關鍵值,不應假定或不需要ASCII,並且與定義無關。 ... –

+0

...另外,EDE和EEE都被認爲是在20世紀90年代,當時顯然需要DES的「增強」,但是隻有EDE被標準化了,我會非常驚訝的發現今天的任何實現EEE。 –

+0

@ dave_thompson_085感謝您對EDE標準化的澄清。在奇偶校驗位上,如果軟件實現(轉換爲可能的硬件實現)在低7位中存在更多的熵時採用了每個提供的字節的高7位(如果直接提供加密密碼 - 如果可能愚蠢)。我認爲最明智的做法是保持每個字節的低7位,並將它們與計算奇偶校驗一起移入3DES實現中。當然,它可以做一些不太明智的事情,相反,並且會失去熵。 –

0

Des使用64位密鑰的倍數,但丟棄8位,留下有用的64位密鑰長度。
Triple des可以使用雙重或三重密鑰長度。
但是,因爲使用相同的密鑰重複des解密運行des的消息,偶數次可以部分解密如果密鑰共享模式的東西。

因爲這個原因des總是跑奇數次。

這也是爲什麼你不應該選擇一個重複64位部分的密鑰。

利用三重DES 192位,你這樣有112位