2012-04-20 39 views

回答

4

通過拾取它們不以任何方式彼此相關的三個獨立的DES密鑰開始。

您需要將DES放入ECB模式,而不是CBC模式。您還需要確保每個加密和解密操作僅在64位塊上完成,沒有更多或更少。填充方案等將導致實現中的漏洞,並且將導致通過蠻力發現塊內容的速度比對每個密鑰的蠻力更快。

利用第一密鑰,加密您的明文。使用第二個密鑰解密該值。使用第三個密鑰,加密完整塊的值。它看起來像這樣:

Encrypt(k3, Decrypt(k2, Encrypt(k1, plaintext)))

解密是周圍的其他方法,看起來像這樣:

Decrypt(k1, Encrypt(k2, Decrypt(k3, ciphertext)))

當加密塊用3DES然後需要申請您的運行模式如CBC或CTR,並在需要時應用填充。

要小心。

0

3DES只是DES使用的明文三次:

ciphertext = E_K3(D_K2(E_K1(plaintext))) 
plaintext = D_K1(E_K2(D_K3(ciphertext))) 

E_Kn = Encryption with Key number n. 
D_Kn = Decryption with Key number n. 

所以,你可以很容易地 「模仿」 只用DES 3DES。

在CBC模式中你需要一個四開始,然後異或與以前的密文塊的下一個明文塊。如果你的設備不支持CBC,那麼這也很容易「模擬」。

+0

如果在塊邊界上不執行操作,由於填充和應用CBC,將導致不安全的實現。 CBC和填充必須在複合3DES操作之後完成。 – 2012-04-20 12:26:40

+0

@ MichaelJ.Gray這不是一個非常明確的建議邁克爾。對於加密,我不認爲你想在複合3DES操作之後進行填充。 – 2012-04-20 13:55:13

+0

@owlstead我的錯誤。你是對的。 CBC將在之後被應用,原因很明顯,並且將以加密(k3,Decrypt(k2,Encrypt(k1,Pad(plaintext))))的形式對未對齊的塊進行填充。當我昨晚發佈時,已經很晚了;) – 2012-04-20 22:12:08

1

塊模式加密

你要做的就是,你在兩個或三個分別分成大小爲128位(16字節)或168位(24字節)的密鑰。因此,對於一個16字節的密鑰K,你將有兩個密鑰Ka和Kb,對於一個24字節的密鑰,你將有Ka,Kb和Kc。 DES ABC鍵具有約112比特的有效強度,DES ABA鍵有一個有效強度的約80比特。要加密一個8字節的塊(DES和3DES的塊大小),你需要執行下面的加密操作:Cn = E(Ka,D(Kb,E(Kc,Mn)))其中Mn是純文本消息的第n個塊,並且Cn是密文的第n個塊。如果你沒有Kc,那麼你可以使用Ka(DES ABC鍵和DES ABA鍵)。

爲此,需要一個單獨的塊加密的DES,其等同於在ECB模式的單個塊加密,或者與CBC單個塊加密和由值00H的8個字節的IV。

CBC

所以這是排序的塊加密,現在你需要某種形式的加密模式和填充模式。我將在這裏解釋CBC模式加密,ECB不應該用於加密非隨機數據。

使用CBC模式加密,您可以將矢量與純文本進行異或運算。矢量通常只是最後一個DESede加密塊的輸出。由於您沒有任何前面的密文,您需要使用隨機數據自己創建第一個向量。這個向量被稱爲初始化向量或IV。請參閱wikipedia以獲得清晰的圖像。

填充

塊密碼模式只允許純文本的完全塊進行加密。所以你需要一些填充方案。儘管有很多填充模式,但大部分時間都使用PKCS#5填充。您應該像下面這樣填充純文本:填充字節值爲0Xh,其中X是創建完整塊所需的填充字節數。 X應該在1到8之間:換句話說,總是使用PKCS#5填充;這使得可以從純文本中區分填充字節。

如果您在在線協議中使用填充,那麼您需要防止填充oracle攻擊。在這種情況下,強烈建議使用某種形式的完整性檢查,例如,通過使用單獨的密鑰在密文上添加HMAC。