一次性密碼本

一次性密碼本,是一種用於安全地傳送和存儲數據的方法。傳送主機生成一個隨機字元序列作為密鑰流,以該密鑰流作為一次性密碼本。將密鑰流與明文按位“異或”產生密文。將密鑰流和密文通過物理上分離的通信路徑路由到接收主機,接收主機通過使用“異或”運算將密鑰流套用到密文對其進行解密。使用MPLS標記或者嚴格路由選項建立分離的路由路徑。

定義

一次性密碼本(One-timePad;OTP)是密碼學中的一種加密算法。是以隨機的金鑰(key)組成明文,且只使用一次。

一種通過套用一次性密碼本安全地存儲數據的方法,所述方法包括以下計算機實施步驟:接收第一數據流,所述第一數據流包括真正隨機生成字元的密鑰流;接收包括密文的第二數據流,其中在兩個物理上分離的路由通信信道上接收所述第一和第二數據流,其中所述密文包括源文本,通過使用異或運算將所述密鑰流套用到所述源文本,對所述源文本進行加密;使用所述密鑰流對所述密文進行解密,導致產生和儲存等同於所述源文本的解密數據。

歷史記載

一次性密碼本比計算機的歷史還要早,可以回溯到1917年。它們是在第二次世界大戰期間偶然用於高安全通信的。“一次性密碼本”中的“密碼本”來源於密碼術的最初形式:密鑰材料列印在厚厚的本子上,每頁一個字母。

一次性密碼本在今天仍在一些有限的範圍內使用。許多政府部門使用短波無線電將加密的訊息傳達給戰場上的間諜。特工人員有一個短波接收器,知道要調到哪個台以及何時調。無線電台只不過廣播了自動聲音讀出一系列數字。這些數字被斷開的方式清楚地表明有多條訊息,每條訊息都有一個有關訊息的頭信息。這種信息通常包括訊息的長度和想要的接收者。間諜收聽第一組數字,以確定是否有訊息在等著他。如果有,他接收到訊息的密文,並根據頭信息來確定從他的那本一次性密碼本的哪裡開始。然後將訊息解碼,最後銷毀訊息和在一次性密碼本中任何使用過的頁。
在軍事和政府部門套用中使用的加密算法與我們在計算機上使用的略有不同,但在實際中都是一樣有效的。我們將給出一個算法示例,假設一條訊息只由從A到Z中的26個可能的字母組成。密碼本應該用從1到26的數字填充,可能少到每頁一個數字,但通常一頁有4到5個數字。要加密訊息的第一個字母,將等價數(如,"A"=1,"Z"=26)與密碼本上顯示的第一個值相加。如果得出的數字大於26,從該值中減去26。結果被轉換回一個字母,然後寫下它。對該頁上的每個數字執行這一操作,然後密碼本的最上一頁被撕下銷毀。隨後為第二組及以後組的字母重複這一過程。根據這種組織,密碼本每頁上最少可以包含一個數字。通常他們在每頁包含5個數字的組。總而言之,使用這種方法編碼訊息是種單調乏味的工作。
解密訊息需要的密碼本和用於加密訊息所用的密碼本一模一樣。從密碼本的第一頁開始,密文的第一個字母被轉換成一個數字,從密碼本上的數中減去這個值。如果結果是零或小於零的數,在結果上加26。然後這個數再被轉換回字母。(這種簡單的算法總是能產生和原始純文本第一個字元相同的字母。)本子的最上面一頁就用完了,撕下並銷毀。然後,繼續對本子第二頁進行解密。這又是單調乏味的工作。

密碼本的生成

生成密碼本是另一個難題。使用WarandPeace這段文本作為密碼本的基礎不是好主意。因為密鑰不是隨機的,那么密文就不是隨機的。已使用的一種技術與今天的抽獎活動使用的方法相同。編了號的球被放在一個封閉的箱子中,空氣將球吹得到處都是。一個操作員使用這個箱子來創建兩個相同的密碼本。對於密碼本上的第一個字元,操作者看都不看就從箱子中抽取出一個球。在兩個密碼本上記錄下球上的數字,然後將球放回到箱子中。然後重複這個過程。乏味的工作。
即使象選球這樣的技術在現實世界中也不是很實用的。事實上,生成和分發密碼本的困難正是在第二次世界大戰中選擇幾百個不那么安全的密碼代碼的一個主要原因。
一次性密碼本在戰場中使用時就顯示了非常多的問題。首先,密碼本必須在兩個通信方之間同步。請考慮當Alice向Bob傳送訊息,而Bob同時又向Alice傳送訊息的情況。他們兩個人使用了某些密鑰來進行加密。如果每一方都精確地遵照算法操作,那么兩個人就都不能有正確的用於解密任何一方訊息的密碼本了!
更糟糕的是,使用相同的密鑰加密兩條訊息會泄露算法的安全性。如果某個人要猜兩條使用相同本子加密的訊息,這個人就可以同時恢復這兩條原始訊息。這種風險經常會產生。懶惰的士兵偶爾會使用用過的本子,有目的的密碼專家注意到了,就會使通信雙方認為非常安全的訊息,此時也不怎么安全了。
要解決這個問題,有必要給Alice和Bob兩個人每人一組兩本一次性密碼本。一組本子特定於從Alice到Bob的訊息,另一組特定於從Bob到Alice的訊息。現在,只要密碼本不被重用,並且只要密碼本在使用後被銷毀,使得沒人能夠泄露用過的密碼本,所有內容就都是安全的了。
不幸的是仍然有另一個問題--數據完整性。讓我們構想一下Alice在早上10:00向Bob傳送了一條訊息,然後在下午1:00傳送了一條,最後在晚上5:00又傳送了一條訊息。如果早上10:00的訊息由於送信人中彈而永遠不能到達,Bob要解密後面兩條訊息就非常困難了。不是不可能,但這是主要的不便,因為Bob在嘗試解密下午1:00的訊息時,必須猜出要從本子中的什麼地方開始。一種解決這種問題的辦法是為訊息編號,並對每條訊息只使用一個本子。另一個解決方案是每天使用一個本子;這樣一次只能擾亂一天的通信。  

安全性

在理論上,此種密碼是牢不可破的,而它的安全性已由克勞德·艾爾伍德·香農所證明。

雖然它在理論上的安全性無庸置疑,但在實際操作上卻有著以下的問題:

用以加密的文本,也就是一次性密碼本,必須確實是隨機產生的。

它至少必須和被加密的檔案等長。

用以加密的文本只能用一次,且必須對非關係人小心保密,不再使用時,用以加密的文本應當要銷毀,以防重複使用。

加密方法

首先手上要有一本一次性密碼本用以加密檔案,接著將一次性密碼本里的字母,與被加密檔案的字母給依序按某個事先約定的規定一一相混,其中一個相混的作法是將字母指定數字(如在英語中,將A至Z依序指定為0至25)然後將一次性密碼文本上的字母所代表的數字和被加密檔案上相對應的數字給相加,再除以該語言的字母數,假設是n(如英語為26),若就此得出來的某個數字小於零,則將該小於零的數給加上n,如此便完成加密。

舉例說明

舉例一

若要加密訊息“Thisisanexample”,而用以加密的一次性密碼本如下所示:

MASKLNSFLDFKJPQ

則利用指定數字的方法,可分別將兩者給做以下的轉換:

Thisisanexample→19781881801342301215114

MASKLNSFLDFKJPQ→1201810111318511351091516

兩者依序相加後得到的訊息如下:

3172628193118181526522242620

將以上得到的訊息模26後可得:

5702758811052224020

它也就變成了

FHACHFIILAFWYAU

而若要解密以上信息,反向操作即可。

舉例二

考慮這樣一條訊息:"One-timepadsarecool."。我們必須把它寫成:ONETIMEPADSARECOOL
轉換成數字,訊息就是:1514052009130516010419011805031515 12
假設本子上的前18個數字是:0215182402142409201409100117190219 13
對於第一個字母,我們將15和2相加得到17。"Q"是字母表中第17個字母,因此是密文的第一個字元。對於第二個字母,我們將14和15相加得到29。因為該數大於26,我們減去26,得到3,它轉換成字母"C"。最終我們得到以下密文:QCWRKACYURBKSVVQHY
要解密這條訊息,首先將密碼術文本轉換回數字:1703231811010325211802111922221708 25
我們所使用的本子和用來加密訊息的本子完全一樣。因此,本子上的第一個數字是2。從17中減去2,得到15。將15轉換回字母"O"。下一步,從密文中取出第二個數字3,從中減去15,因為15是本子上的第二個數。結果是-12。因為這個結果小於1,在這個數上加26,得出14。第14個字母是"N"。以那種方法繼續,最後我們就恢復了整條訊息。

相關分析

一次性密碼本是否真有一種完美的加密算法?從理論上說,有的。如果使用正確的話,一次性密碼本就是不易破解的。但這種算法在實踐中用得並不多。在這篇文章中,我們將談談一次性密碼本、其優缺點,以及為什麼有其它加密算法存在。
密碼術有時更是一種藝術而非科學。例如,我們無法確切回答一個象“Rijndael算法有多安全?”這種看似簡單的問題。因為Rijndael使用128位(或更大)密鑰,我們甚至可以用到數字2128。但在現實中,沒人真的知道Rijndael有多安全,因為要證明有關算法的安全性保證相當困難。要假設沒有一種攻擊能成功破壞任何給定的算法幾乎是不可能的。有一個困難是每隔一段時間,新的密碼攻擊就會被發現。但當我們考慮到想證明一種密碼術能經受得住任何未來的攻擊,甚至包括以後幾個世紀都不會被發現時,事情就變得更加困難了。
在現實中,那些確信安全的常用密碼術實際上有可能安全,也有可能不安全。我們信任密碼術是因為還沒有人能破解它,而不是因為知道它是安全的。這就是為什麼密碼專家更傾向於推薦那些已被深入審查過的密碼術,而不是更新或專用的密碼算法。工作原理是,如果許多聰明的腦瓜都無法破解一種算法,那么比起沒人仔細看過的那些算法來,它更有可能是安全的。關於一個問題思考的人越多,我們越有可能信任一種算法。這意味著我們最終討論的是算法的“最佳情況”安全性特性。使用對稱密鑰密碼術,“最佳情況”時常與密鑰空間的大小相關--除非已經知道有比嘗試每個可能的密鑰來公開數據(蠻力攻擊)更好的辦法。以上這些方法的結果可能會引起一些不安:所有對稱密鑰算法都可以被破解,只要有足夠的時間。最終,我們將希望寄托在一種想法上,即沒有人能有足夠的時間來破譯我們的代碼!例如,如果我們使用的是256位的加密算法,沒有僅比蠻力攻擊更有效的攻擊來對付它,我們就可以認為一個攻擊者在有限時間內破解密碼的幾率相當小。
從數學上證明有關公鑰算法的問題比對稱算法要來得容易。這是因為公鑰算法往往基於詳細定義的數學問題(例如由質數組成的因式分解組合)。與之相反,對稱算法往往是一組特別的替代與排列,要在上下文中分析它們比較困難。因此,假設有種完美的實現,我們知道破解RSA算法的困難與對非常大的數字進行因子分解的困難是緊密聯繫在一起的。數學家相信對大的數字進行因式分解在相當長的一段時間內也不能完成。不幸的是,至今沒有一個人能證明因式分解確實那么難。
即使我們知道因式分解是那么的困難(並假設沒有其它的實現或設計問題),對於RSA是可破解的仍然有一些理論限制,與對稱算法的情況一樣。如果在有限時間內嘗試出密鑰的同時空等,那么絕對能破譯RSA密鑰!

盤點密碼學相關知識

盤點密碼學相關知識,密碼學是研究編制密碼和破譯密碼的技術科學。

相關搜尋

熱門詞條

聯絡我們