流密碼和分組密碼的區別
我讀到了
典型的流密碼一次加密一個字節的明文,儘管流密碼可能被設計為一次操作一位或一次操作大於一個字節的單位。
(來源:密碼學和網路安全,William Stallings。)
分組密碼一次加密一個分組。該塊的大小可以是一個字節或更多或更少。這意味著我們還可以藉助流密碼將一個字節的塊加密為流。
那麼,流密碼和分組密碼到底有什麼區別呢?
分組密碼是一個確定性和可計算的函式 $ k $ -位鍵和 $ n $ -bit(明文)塊到 $ n $ -bit(密文)塊。(更一般地說,塊不必是位大小的, $ n $ -character-blocks 也適合這裡)。這意味著,當您使用相同的密鑰加密相同的明文塊時,您將得到相同的結果。(我們通常還希望函式是可逆的,即給定密鑰和密文塊,我們可以計算明文。)
要實際加密或解密消息(任何大小),您不直接使用分組密碼,而是將其置於一種操作模式中。最簡單的這種模式是電子密碼本模式 (ECB),它只是將消息分成塊,將密碼應用於每個塊並輸出結果塊。(不過,這通常不是安全模式。)
一些早期的加密方案,如 Caesar 使用的加密方案,可以歸類為“ECB 模式下具有 1 個字元塊的塊密碼”。或者一般來說,所有有密碼本的東西。
我們通常使用其他操作模式,包括初始化向量和某種回饋,以便每條消息的每個塊都以不同的方式加密。
流密碼是直接映射的函式 $ k $ -位密鑰和任意長度的明文到(相同的任意長度)密文,這樣明文的前綴映射到密文的前綴,即我們可以在明文的尾隨部分已知之前計算密文的起始部分. (通常消息大小也可能被限制為某些“塊大小”的倍數,但通常使用較小的塊,如整個字節等。)
如果明文的一部分重複,則對應的密文通常是不一樣的——消息的不同部分將以不同的方式加密。
通常,此類流密碼通過從實際密鑰(可能還有初始化向量)生成密鑰流,然後簡單地將其與消息進行異或運算——這些被稱為同步流密碼。其他流密碼可能會根據之前的部分改變對消息未來部分的加密。
一些分組密碼操作模式實際上創建了一個同步流密碼,如CTR和OFB模式。
您永遠不應該為不同的消息重用同步流密碼(包括流模式中的塊密碼)的密鑰(和 IV,如果適用),因為這可能會導致妥協。(即使對於同一條消息,它也會顯示您重複了一條消息。)
請注意,在實際使用中,您還需要一個 MAC,例如完整性保護,用於您的消息。(例如,在選擇密文攻擊的情況下,某些方案會被破壞,這樣的 MAC 將防止這種情況發生(如果您僅在檢查 MAC 後將消息傳遞給解密器)。)