努力理解 CFB 模式(使用 DES)
我真的很難理解 CFB 模式(如果重要的話,使用 DES)。在這裡搜尋後,我意識到這些模式現在已經過時了,但我需要在課堂上了解它們。從wikipedia,我看到加密: $$ C_i = P_i[:s] \oplus E_k(S_i)[:s] $$ $$ S_0 = IV $$ $$ S_i = (S_{i-1} << s) | C_i $$ (我正在使用類似 python 的符號,所以
$$ :s $$意味著首先 $ s $ 位)。 我已經無法理解這種加密方案以及錯誤是如何傳播的。維基百科說,如果 $ C_i $ 損壞,然後加密最終將恢復。我試著在這裡閱讀關於這個的討論,但我沒有看到這個(我希望得到更詳細的解釋)。
比方說 $ s=4 $ 位, $ IV $ 是64位,那 $ C_2 $ 變得損壞,以至於我們正確計算 $ C_1 $ 和 $ C_2 $ 從 $ P_1 $ 和 $ P_2 $ 但我們無法正確計算 $ C_3’ $ 自從$$ C_3 = P_3[:4]\oplus E_k((IV << 8) | C_1 | C_2’)[:4] $$ 所以 $ E_k((IV << 8) | C_1 | C_2’) $ 給出不正確的加密,因此不正確 $ C_3 $ 我表示為 $ C_3’ $ . 如果我繼續這種模式,似乎我總是得到一個不正確的 $ C_i $ 因為移位寄存器總是錯誤的。例如考慮
$$ C_{17}’ =^{?} P_{17}[:4]\oplus E_k((IV << 64)|C_1|C_2’|C_3’|…|C_{16’}) $$
$$ = P_{17}[:4]\oplus E_k(C_1|C_2’|C_3’|…|C_{16}’)[:4] $$
但這仍然給出了錯誤的值,所以我不確定係統為什麼會恢復。我有什麼誤解?
所以 $ E_k((IV << 8) | C_1 | C_2’) $ 給出不正確的加密
那是你的問題;CFB 並非旨在糾正明文中的錯誤 - 畢竟,如果密文沒有被修改,那麼解密器將準確地得到加密器加密的內容,因此如果原始明文有錯誤,然後是正確的,那麼解密器將得到完全相同的錯誤,然後是正確的。
相反,CFB 關心的是密文是否被修改。只要 $ C_3’ $ 仍然在移位寄存器中,是的,解密器會亂碼。然而,在 16 次移位(8 個字節)之後, $ C_3’ $ 會掉出移位寄存器。然後,這 8 個字節正是加密器的意圖,因此它將開始正確解密(只要密文中沒有進一步的錯誤,它就會一直如此)。
當然,CFB的名聲並不是說它可以適應密文中的位翻轉(畢竟CBC也有同樣的屬性,OFB更好);如果根本沒有收到段,CFB 還會處理它。例如,假設如果 $ C_3 $ 沒有收到錯誤,但根本沒有收到;也就是解密器收到 $ C_1, C_2, C_4, C_5, C_6,… $ . 使用 CFB,接下來的 8 個字節將被錯誤地解密,但之後,移位寄存器將重新同步,之後的所有內容都將正常解密。這與 CBC 形成對比,如果 4 位塊被丟棄,它將永遠不會重新同步(因為所有內容都以 64 位塊處理,並且這些塊不再排列)。
如果您想知道什麼會導致這樣的錯誤,那麼,回到過去,確實有通信通道(例如 RS-232),您可以在其中添加或刪除單個字節。在這樣的線路上進行 CFB 將提供一個可用的加密通道,即使發生這種情況。
當然,如今,我們並不關心恢復此類添加/刪除錯誤,而是更關心可能故意導致此類錯誤的攻擊者(並試圖從中獲得優勢);因此,今天的時尚是將明文字節序列放入記錄中,並對這些記錄執行經過身份驗證的加密。因此,CFB 的優勢在今天不被視為優勢……