之前介紹的對稱加密算法都是分組加密,如DES,3DES,SM4等。被加密的原文需要分成組,每組長度與密鑰長度相同,再分別加密。實際上,對稱加密裡還有一種類型算法叫做流加密。所謂流加密,就是使用一個與原文同樣長度的密鑰,與原文數據按位進行異或操作,得到的結果就是密文。解密過程和加密類似,就是用同樣的密鑰,對密文在進行按位異或,得到明文。這和異或運算的原理有關,假設P是原文,K是密鑰,E是密文,⊕代表異或運算,則有如下加密算式:
E = P⊕K
根據異或運算原理,相同的數異或結果為0,任何數與0異或得到的是它本身,故可推導如下解密算式:
E⊕K= P⊕K⊕K
=P⊕0
=P
可以這麼理解,流加密就是給原文數據的每一位依次戴個帽子,把原數據隱藏起來,解密就是摘掉帽子,把原數據露出來。因此它的優點就是簡單快捷。看到這裡估計你也意識到了,既然加解密方法這麼簡單,那麼流加密的重點應該就在密鑰上吧?事實確實如此,比如,我們以A、B為明文,使用同樣的密鑰K,進行流加密得到加密結果E(A)和E(B),則根據異或運算特點可以做出如下算式:
E(A)⊕E(B)⊕B=(A⊕K)⊕(B⊕K)⊕B
=A⊕B⊕(K⊕K)⊕B
=A⊕B⊕0⊕B
=A⊕B⊕B
=A⊕0
=A
可以看出,只要拿到兩個密文和一個明文,就可以計算出另一個明文。實際中,密文是比較容易拿到的,而攻擊者也完全可以自己提交一個明文送給系統加密。即在密鑰相同的情況下,明文是很容易被計算出來的。因此流加密的安全性來源於其密鑰的安全性。實際上,資訊理論的祖師爺香農早在1948年就在理論上證明了如果流加密的密鑰要不小於與被加密原文長度,每加密的密鑰做到一次一密。這樣的加密就實現了「完善保密性」,也就是「絕對安全」。當然,目前這種「絕對安全」只能無限趨同,不可能真正做到。
流加密的密鑰可分為同步流密碼和自同步流密碼。同步流密碼是指密鑰流的生成過程是獨立的,明文及密文不參與其中;而自同步流密碼(也叫異步流密碼)中的密文參與到密鑰流的生成。
同步流密碼一般採用偽隨機數生成算法生成隨機數列作為密鑰組成部分。顯然,密鑰的隨機性越強,明文中的統計特徵被覆蓋得更好,加密的強度也就越高。在現實中經常使用的一種方法是用線性反饋移位寄存器(LFSR)來生成偽隨機序列。線性反饋移位寄存器是一種電路,它是許多密鑰流生成器的基本部件;非常適合硬體的實現;可以產生大周期序列;可以產生具有良好統計性質的序列;易於利用代數方法對其進行分析。
除了線性反饋移位寄存器外,還有一種基於較短的一串給定密鑰,派生出無限長(實際上達到原文長度即可)的偽隨機密碼流的流加密方法。具有代表性的是就RC4(Rivest Cipher 4)算法。RC4採用一個256位元組的狀態向量S,256位元組的暫時向量T,和用戶自定義的密鑰輸入構成。通過自定義的密鑰生成暫時向量之後,狀態向量S與暫時向量T通過一系列的置換算法產生可用於加密的偽隨機密鑰流,參與加密。
流加密最重要的就是密鑰,但容易出問題的也是密鑰。
首先流加密屬於對稱加密,那就有一個密鑰交換的問題,也就是加解密雙方事先得有一個辦法可以安全地交換密鑰。但流加密的密鑰長度是和明文一樣長的,而且只能使用一次,交換的成本相對加密行為來說不低。而且,既然能安全交換密鑰,為什麼不直接安全交換同樣長度的明文呢?
其次,流加密安全性來源於密鑰的隨機性,也就是偽隨機序列的隨機性。但前面隨機數一文說過,並不存在真隨機數。像RC4算法、WEP協議、DVD使用的數據加密協議,由於設計或其他限制,也都存在密鑰隨機序列在一定條件下重複出現的概率。這些都會影響流加密的安全效果。
總體來講,由於本身密鑰的使用成本及安全性問題,流加密在實際應用中出現的頻率遠低於分組加密。但流加密的一些優點,也被分組加密算法所吸收應用,如通過不同的工作模式實現類似流密碼算法的特性。