既然一次性密碼本是安全的,為什麼實務上不太使用呢?
很明顯的,一次性密碼本最大問題就是要如何讓接收者也知道每次隨機生成的密鑰K
你可能會想:那我們就讓K在生成的同時也順便傳送到接收者手上就好了
但是反過來,既然我們有這個技術可以安全地將K傳到接收者手上,那為什麼不用這個技術直接將明文P傳送過去呢?
因此,為了增加他的實用性,我們必須放棄一點點安全性,如此便有了串流加密法的概念
串流加密是將隨機生成的密鑰K送進某個特殊的函數中,生成S,稱為 串流密鑰(keystream)
欲進行加密,Alice即可將這組串流密鑰S與明文P進行XOR
的動作,形成密文C
假如事先和Bob約定好演算法以及密鑰K,Bob就可以自己生成串流密鑰S,再將密文XOR
一次,還原回明文P
雙方將固定的密鑰K送進特殊的函數中產生串流密鑰S,此S才是真正扮演加密的角色,密鑰K只是負責產生S而已
如以下範例
密鑰 | 串流密鑰(16進位) | 明文 | 密文(16進位) |
---|---|---|---|
Key | EB9F7781B734CA72A719… | Plaintext | BBF316E8D940AF0AD3 |
密鑰KEY
負責生成一個相當複雜的串流密鑰,該串流密鑰與明文XOR
後得到密文
就好像前幾天的python程式碼中生成隨機數字的seed
一樣,固定K可以生成出看似隨機的S出來,讓串流密鑰的生成彷彿隨機生成的密鑰
著名的串流加密法有A5/1, RC4 他們分別對應不同設計精巧的特殊函數,各自合適的應用情境也有所不同
會說串流加密不安全是因為,一但密鑰K重複使用兩次,將會使明文相當容易破解
例如明文A, B使用相同的串流密鑰C做XOR,得到E(A), E(B)
若兩則訊息都被攔下,可以輕鬆得到
E(A) XOR E(B) = A XOR C XOR B XOR C = A XOR B
A XOR B一但知道,就可以仰賴他們是自然語言的性質,計算頻率來破解
好在這些知名的演算法中都有加入聰明的防護機制能更換密鑰K,讓整個解密的過程沒那麼容易