一次性密碼本
一次性密碼本即Vernam Cipher,是由Gilbert Vernam在1917年,開發的一種加密算法。是一種通過在文本的二進制級別上進行工作來對純文本進行加密的密碼技術。之所以叫做一次性密碼本,是因為加密所用的密鑰是一次性的,即密鑰只會使用一次,不會出現因為密鑰泄露導致之前的加密內容被解密。即使密鑰不小心被泄露,也只會影響一次通信過程。
加密
眾所周知,任何信息在計算機內部都是由0,1兩個數字保存,在進行傳輸時需要將傳輸的信息轉化為對應二進制碼傳輸,例如,傳輸文本消息,就需要利用特定的編碼方式編碼,比如常用的ASCII,Unicode等。
一次性密碼本的加密方式非常簡單,就是將明文(待傳信息的編碼)和一串隨機生成的二進制碼進行XOR(異或)運算。
1、將明文編碼,即轉換為二進制。
2、隨機生成和明文二進制位數相同的密鑰。
3、將明文和密鑰的二進制進行XOR操作,生成密文。

解密
解密過程依靠的是XOR操作的自反性,先簡單介紹一下異或操作,如果異或的兩個bit相同結果為0,異或的兩個bit不同結果為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即對同一數進行兩次異或結果將回到最初的狀態。
由此,通過明文和密鑰異或得到的密文,再通過將密文和密鑰再次異或操作得到明文。以此實現一次性密碼本的解密過程。

絕對無法破解
雖然一次性密碼本非常簡單,但是一次性密碼本是絕對無法破解的,這個破解並不是指現有的計算能力不夠,而是指即使擁有無窮大的計算能力也無法破解。
假設我們拿到了密文並進行暴力破解,也就是將所有順序的密鑰嘗試一遍,假設密文長度是128bit,那么我們將得到2^128數量的明文,那么我們怎么判斷哪一個明文是正確的呢?顯然我們無法判斷哪一個是正確的明文,因為在所有的組合排列中可能生成多個有意義的文字。所以這種解密是無意義的,就像是我知道了原文的長度,然后自己構造這個長度的原文。因此一次性密碼本是無法破譯的。
缺點
既然一次性密碼本無法破解,那為什么現實中一次性密碼本沒有被使用呢?
1、密鑰配送問題
密鑰和原文以及密文都是等長的,目標端如果想解密就必須拿到密鑰,如果能有一種方法將密鑰安全地發送出去,那么豈不是也可以用同樣的方法來安全發送明文嗎?
2、密鑰保存問題
如果有辦法安全保存與明文一樣長的密鑰,那不是也有辦法安全保存明文本身嗎?也就是說,從一開始我們根據就不需要密碼。
3、密鑰的重用
在一次性密碼本中絕對不能重用過去用過的隨機比特序列,一次性密碼本中的“一次性”也正是由此而來。這是因為作為密鑰的比特序列一旦泄密,過去所有的機密通信內容將全部被解密。每個密鑰只用一次,這即是缺點也是優點。意味着我們每次都要不停的更換密鑰,增加了復雜性。
4、密鑰的同步
當明文很長時,一次性密碼本也會跟着變長。如果明文是一個大小為100MB的文件,則密鑰的大小也一定是100MB。而且在通信過程中,發送者和接收者的密鑰的比特序列不允許任何錯位,否則錯位的比特后的所有信息將無法解密。
5、密鑰的生成
在一次性密碼本中,需要生成大量的隨機數。這里的隨機數並不是通過計算機程序生成的偽隨機數,而必須是無重復性的真正隨機數。
最后,雖然一次性密碼本無法在現實中使用,但是它給其他的加密算法以啟發,產生了很多個變種。
