Stream-Cipher

如果 message 比 keystream 長怎麼辦?

  • August 15, 2017

我已經讀過流密碼可用於加密任意長度的消息/流(參見流密碼標籤的描述)。但是,有些流密碼可以創建固定長度的密鑰流,並逐位異或消息和密鑰流。

因此,我想知道,如果消息長度長於密鑰流的長度會發生什麼?在這種情況下,密鑰流是否重複應用於消息的其餘部分?

TL,DR:“任意長度”主要是指“長度不必是某個大小的倍數”。

我已經讀過流密碼可用於加密任意長度的消息/流(參見流密碼標籤的描述)。

這通常是這種情況,除了大多數流密碼具有最大長度。最大長度通常遠大於任何實際消息,因此實際上流密碼可以加密任意長度的消息。

關於流密碼的消息“任意長度”的重要一點是,您可以在任何時候停止流。這與塊密碼模式不同,後者只能加密長度是塊大小的倍數的消息。要使用分組密碼加密消息,您需要分組密碼模式(達到大於一個塊的長度)和填充模式(處理最後一個塊,通常只是部分填充)。

例如,AES 是具有 16 字節塊大小的塊密碼。CBC 是一種分組密碼模式(即一種將加密固定大小的塊的方法轉變為加密塊列表的方法)。您可以通過對兩個塊執行 CBC 來使用 AES-CBC 加密 32 字節消息,但不能加密 31 字節消息,因為這不是塊的整數。您需要另外指定填充模式,例如 PKCS#7 填充。您可以使用 AES-CBC-PKCS7 加密任意長度的消息(以字節為單位 - 並且再次達到非常大的最大值) - 首先使用 PKCS#7 填充算法將消息填充到 32 個字節,然後將 CBC 應用於兩個塊. 相比之下,流密碼可以簡單地通過計算 31 字節的密碼流來加密 31 字節的消息。例如,要使用 AES-CTR 加密 31 字節的消息,您只需計算 31 個字節的密碼流並與消息進行異或。因為 CTR 在分組密碼之上建構了流密碼,所以計算密碼流涉及計算兩個密文塊(32 字節)並丟棄最後一個字節。

填充是更喜歡流密碼而不是塊密碼的原因。填充看起來很簡單,但實際上很微妙。特別是解密端對填充的不良處理可能導致填充預言攻擊。話雖如此,如果在經過適當設計的認證加密算法中使用分組密碼,則只有認證加密算法的設計者需要擔心這一點,而不是最終使用者。

但是,有些流密碼可以創建固定長度的密鑰流,並逐位異或消息和密鑰流。

如果密鑰流是固定長度的,那麼它是一次性密碼,而不是流密碼。那是術語的問題。

因此,我想知道,如果消息長度長於密鑰流的長度會發生什麼?

然後你需要一個更複雜的協議,對消息的不同部分使用不同的密鑰(即密鑰更新)。但在實踐中,這基本上不會發生——如果你有那麼多文本要加密,它幾乎總是已經被分割成單獨的消息。

在這種情況下,密鑰流是否重複應用於消息的其餘部分?

絕對不!多次應用相同的密鑰流是非常不安全的。這是一個兩次墊,可以洩露整個資訊。

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