Stream-Cipher

從丟棄的比特中恢復自同步密碼

  • March 21, 2019

這本密碼學書說:

還有非同步或自同步流密碼,其中先前生成的密文位用於生成目前密鑰流位。這有一個有趣的結果,即如果某些密文位失去,接收器最終可以恢復。

CFB是自同步密碼的一個範例。這意味著它可以“在某些密文位失去後最終恢復”是什麼意思?

這是 CFB 的方程式:

$$ C_i = E_K (C_{i-1}) \oplus P_i $$

有4個變數。我看不出你是如何消除兩個以上的,這樣接收者就知道除了一個之外的所有變數,並推斷出唯一的未知變數。

接收者知道 $ k $ . 接收者知道 $ C_i $ 或者 $ C_{i-1} $ ,但不是兩者兼而有之,因為我們正在考慮的情況是“一些密文位被丟棄”。接收方不知道 $ P_i $ 因為它是接收器,它正在嘗試破譯。

我有什麼誤解?

首先,當教科書談到“丟棄比特”時,它們並不是指錯誤接收的比特;相反,他們談論的是刪除某些位的傳輸錯誤。

一個例子是,如果發送者發送了模式:

$$ 0123456789 $$

接收方收到:

$$ 012456789 $$

也就是說,包含該值的字節3已經消失,4緊隨其後的是2.

此外,教科書指的是對 CFB 的更古老的理解。

這是 CFB 的方程式: $$ C_i = E_K (C_{i-1}) \oplus P_i $$

實際上,在 CFB 的原始設計中,它有點複雜。它是:

$$ C_i = \text{Trunc}k(E_K (C{i-1} || C_{i-2} || … || C_{i-n/k})) \oplus P_i $$

在哪裡:

  • $ k $ 是設計者選擇的值
  • $ \text{Trunc}_k $ 是一個只返回第一個函式 $ k $ 它的論點
  • $ P_i, C_i $ 是 $ k $ 位值(而不是完整的塊大小 $ n $ )

這相當於現代對CFB的理解如果 $ k=n $ ; 但是我們也可以考慮較小的值 $ k $ .

現在,我們為什麼要這樣做(特別是考慮到 CFB 變得更小效率更低 $ k $ ; 我們對每個執行一次塊加密 $ k $ 位)?

答案是因為錯誤恢復;假設我們有一個溝通渠道,可以偶然添加或刪除 $ k $ 位(如上所述)。例如,如果我們看一下 CBC 模式,如果我們有一個長加密流,並從密文中刪除 8 位,解密器用來解密的塊不會與加密器使用的塊對齊,所以解密器會亂碼;並且它們永遠不會同步(直到刪除多個塊大小的位)。

相反,如果我們使用 CFB 模式 $ k=8 $ ,那麼從密文中刪除8位就不是什麼大問題了;接下來的 8 個字節(假設塊大小為 64 位;鑑於我們正在談論的歷史背景,這是合適的)將是亂碼,但在那之後,事情會同步,並且(假設通信通道沒有得到更多錯誤)一切都會正確解密。

這就是教科書所指的;即使在添加/刪除錯誤後,CFB 模式(使用適當的 $ k $ ) 將重新同步。

而且,是的,在那些日子裡,我們有可以添加或刪除比特塊作為常見錯誤的通信渠道;RS-232 可以刪除或(更罕見地)添加字節(等等 $ k=8 $ 在這種情況下是合適的);我相信雙同步可以添加或刪除單個位(等等 $ k=1 $ 會在那里工作)。

現在,這一切都是歷史性的;在現代錯誤中,如果攻擊者可以修改文本,我們對攻擊者可以做的事情更加敏感。因此,我們對 CFB 的自同步特性不太感興趣,並且更關心檢測何時發生任何錯誤(意外或惡意)。

在這種情況下,“恢復”並不意味著即使失去部分密文也可以恢復完整的明文。相反,自同步流密碼的“最終恢復”屬性只是意味著從密文不會將同一消息中該塊之後的所有*解密明文變成垃圾,就像使用同步密碼一樣(因為同步會失去)。

您仍然會得到一些垃圾,當然您將不可避免地失去與丟棄的塊相對應的明文。當然,整個事情只有在丟棄段的長度是回饋長度的倍數時才有效。(回饋長度 $ \ell $  CFB 模式的位數可以是從 1 到底層塊密碼的塊大小的任意位數。但是,使用比密碼塊大小更短的回饋長度會使加密和解密速度變慢,因為需要一個塊密碼加密操作來處理每個 $ \ell $ 消息數據位。)

如果這一切看起來有點平淡無奇,那麼你沒有錯。引用上面 Squeamish Ossifrage 的評論

“僅供參考,基本上沒有人關心自同步流密碼或錯誤傳播或類似的東西了;CFB 和 OFB 現在很少在實踐中使用;並且“分組密碼操作模式”的概念框架已在很大程度上被丟棄一次在任意長度的數據包上支持經過身份驗證的密碼AEAD(與相關數據的身份驗證加密),如 AES-GCM 或 crypto_secretbox_xsalsa20poly1305。因此,如果您正在研究歷史密碼學或可怕的遺產以外的任何內容,請不要太擔心這一點密碼學 API。”

或者我可以只引用與您相同的文本,一句後:

“在現代密碼系統中,這通常不再被認為是理想的屬性,而是更喜歡發送完整的、經過身份驗證的消息。”


如果您希望即使某些密文失去也能夠完全解密消息,實現它的最佳方法可能是在加密(和身份驗證)對密文應用擦除程式碼。基本上,不要嘗試混合加密和糾錯,而是將它們視為單獨的層。

引用自:https://crypto.stackexchange.com/questions/68117