一次性密碼本
一次性密碼本即Vernam Cipher,是由Gilbert Vernam在1917年, 開發(fā)的一種加密算法。
之所以叫做一次性密碼本,是因?yàn)榧用芩玫拿荑€是一次性的,即密鑰只會使用一次,不會出現(xiàn)因?yàn)槊荑€泄露導(dǎo)致之前的加密內(nèi)容被解密。
即使密鑰被泄露了,也只會影響一次通信過程。
加密之前的準(zhǔn)備
通常來說,如果我們想將一個消息加密傳輸需要做什么工作呢?
在現(xiàn)代計算機(jī)社會,大家都知道計算機(jī)只能表示0,1這兩個數(shù)字,那么如果傳輸文字,則需要將文字轉(zhuǎn)換為對應(yīng)的二進(jìn)制編碼。
現(xiàn)有的編碼規(guī)則有很多,比如:ASCII,Unicode等,在后續(xù)的文章中我們會做介紹。
同樣的,對于編碼過后的文字進(jìn)行加密,就是將編碼過后文字的二進(jìn)制通過一定的bit運(yùn)算,而得到加密后的結(jié)果。
一次性密碼本的加密方式
回到一次性密碼本,他的加密方式非常簡單,就是將明文和一串隨機(jī)的二進(jìn)制進(jìn)行XOR運(yùn)算。這個隨機(jī)的二進(jìn)制數(shù)可以通過不斷的拋擲硬幣來產(chǎn)生(正面表示1,反面表示0):
- 將明文編碼,即轉(zhuǎn)換為二進(jìn)制。
- 生成和明文二進(jìn)制位數(shù)相同的密鑰。
- 將明文和密鑰的二進(jìn)制進(jìn)行XOR操作,生成最后結(jié)果。
一次性密碼本的解密
加密之后我們怎么去做解密呢? 我們先看一下XOR的特性。
XOR是指異或操作,比特位上的數(shù)字一樣,異或的結(jié)果就是0,比特為上面的數(shù)字不一樣,異或的結(jié)果就是1。
舉個例子:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
異或的一個非常重要的特性就是可逆,即:
A XOR B= C ,則 C XOR B = A 。
那么通過原文和密鑰異或得到的結(jié)果,可以通過將結(jié)果和密鑰再次異或操作得到原文。
這就是一次性密碼本的解密過程:將密鑰和結(jié)果進(jìn)行異或。
無法破譯
雖然一次性密碼本非常簡單,但是一次性密碼本是無法破譯的,這個破譯并不是指現(xiàn)有的計算能力不夠,而是指即使擁有無窮大的計算能力也無法破譯。
為什么呢?
假如你拿到了加密的結(jié)果,然后遍歷等長的密鑰進(jìn)行暴力破解,最后你會生成原文,假設(shè)這個原文長度是128bit,那么就可以生成2的128次方個原文,即128bit長度的原文的所有組合排列。
即使這些組合里面出現(xiàn)了一些有意義的文字,但是你不能確定這些文字是不是就是原文,因?yàn)樵谒械慕M合排列中可能生成多個有意義的文字。
所以這種解密是無意義的,就像是我知道了原文的長度,然后自己構(gòu)造這個長度的原文。
缺陷
既然一次性密碼本這么好,那么為什么我們在實(shí)際的工作中很少用到呢?
- 密鑰太長
一次性密碼本是用與原文等長的密鑰做異或得到的,如果原文很大,那么相應(yīng)的密鑰也非常大。
- 無法重用密鑰
每個密鑰只用一次,即是缺點(diǎn)也是優(yōu)點(diǎn)。意味著我們每次都要不停的更換密鑰,增加了復(fù)雜性。
- 密鑰的配送
因?yàn)槊荑€和原文以及密文都是等長的,目標(biāo)端如果想解密就必須拿到密鑰,如果能夠機(jī)密的傳輸密鑰給目標(biāo)端,那為什么不直接將原文機(jī)密的傳送給目標(biāo)端呢?
- 密鑰的保存
每次加密都需要換一個密鑰,這意味著每一個明文都需要保存一個同樣長度的密鑰,如果明文已經(jīng)可以很好的保存了,那何必多做一步加密呢?
雖然一次性密碼本有這么多缺點(diǎn),但是他給其他的加密算法以啟發(fā),于是產(chǎn)生了很多個變種,后面我們會介紹更多的加密算法。
更多教程請參考flydean的博客