本質上,古典密碼除非配上一把巨大的金鑰,否則不可能安全;但用巨大的金鑰加密並不實際。

一次性密碼本(one-time pad)正是這樣一種密碼,而它是最安全的密碼。事實上,它保證完美保密(perfect secrecy):即使攻擊者擁有無限的計算能力,也不可能學到明文的任何資訊,除了它的長度。

用一次性密碼本加密#

一次性密碼本接收明文 P 與一把與 P 等長的隨機金鑰 K,產生密文 C

C = P ⊕ K

其中 CPK 都是等長的位元字串, 是逐位元互斥或(XOR)運算:

0 ⊕ 0 = 0
0 ⊕ 1 = 1
1 ⊕ 0 = 1
1 ⊕ 1 = 0

解密與加密完全相同,同樣只是一次 XOR:

P = C ⊕ K

因為 C ⊕ K = P ⊕ K ⊕ K = P——把 K 與自己 XOR 會得到全零字串 000...000。就這樣,比凱撒密碼還簡單。

實際計算#

P = 01101101
K = 10110100

加密:C = P ⊕ K = 01101101 ⊕ 10110100 = 11011001
解密:P = C ⊕ K = 11011001 ⊕ 10110100 = 01101101

這裡以慣用的位元形式呈現一次性密碼本,但它也可以改用其他符號。若改用字母,你會得到凱撒密碼的一個變體——只是每個字母的位移量都是隨機挑選的。

為什麼「一次」如此關鍵#

重點在於一次性密碼本只能用一次:每把金鑰 K 都只該使用一次。

若同一把 K 被用來把 P₁P₂ 加密成 C₁C₂,竊聽者可以計算:

C₁ ⊕ C₂ = (P₁ ⊕ K) ⊕ (P₂ ⊕ K) = P₁ ⊕ P₂ ⊕ K ⊕ K = P₁ ⊕ P₂

竊聽者因此學到了 P₁P₂ 的 XOR 差值——這是應該保密的資訊。更糟的是,只要其中任一段明文已知,另一段就能被還原。

為什麼一次性密碼本是安全的#

一次性密碼本雖不實用,但理解它為何安全很重要。1940 年代,美國數學家夏農(Claude Shannon)證明:要達到完美保密,一次性密碼本的金鑰長度至少必須與訊息一樣長。

證明的想法相當簡單。你假設攻擊者擁有無限的算力,因此可以試遍所有金鑰。目標是讓加密後的結果使攻擊者無法排除任何一個可能的明文

直覺#

K 是隨機的,對攻擊者而言產生的 C 看起來就和 K 一樣隨機,因為隨機字串與任何固定字串做 XOR 都會得到隨機字串。

考慮一個隨機字串的第一個位元是 0 的機率——是 1/2。那麼一個隨機位元與第二個位元 XOR 後為 0 的機率是多少?同樣是 1/2。這個論證可以推廣到任意長度的位元字串。

因此密文 C 對不知道 K 的攻擊者而言看起來是隨機的,所以即使攻擊者擁有無限時間與算力,也不可能C 學到任何關於 P 的資訊。換句話說:知道密文完全無助於了解明文,除了它的長度——這差不多就是安全密碼的定義。

為什麼金鑰不能更短#

假設密文長 128 位元(意味明文也是 128 位元),則有 2^128 種可能的密文;因此從攻擊者的角度看,應該要有 2^128 種可能的明文。

但如果金鑰數少於 2^128,攻擊者就能排除掉一部分明文。例如金鑰只有 64 位元,攻擊者可以算出那 2^64 種可能的明文,並排除掉絕大多數的 128 位元字串。攻擊者不會知道明文什麼,但會知道明文不是什麼——這就讓加密的保密性不再完美。

一次性密碼本用起來極不方便:它需要一把與明文等長的金鑰,而且每則新訊息或每組新資料都要一把新的隨機金鑰。要加密一顆 1TB 的硬碟,你得再準備一顆 1TB 的硬碟來存放金鑰。

延伸:一次性密碼本的實際使用史

儘管不便,一次性密碼本在歷史上確實被使用過:

  • 二戰期間的英國特別行動處(Special Operations Executive)
  • KGB 間諜
  • 美國國家安全局(NSA)
  • 至今仍在某些特定場合使用

作者提到:「我聽說有瑞士銀行家因為雙方無法就一種彼此都信任的密碼達成共識,最後改用一次性密碼本——但我不建議這麼做。」

延伸:密碼學中的機率

機率(probability)是表達某事件發生可能性的數字,介於 0 到 1 之間,0 代表「永不」,1 代表「總是」。機率越高,發生的機會越大。

密碼學經常用機率來衡量一次攻擊的成功機會,做法是:

  1. 計算成功事件的數量(例如「找到那一把正確的秘密金鑰」這個事件)。
  2. 計算所有可能事件的總數(例如若處理 n 位元金鑰,金鑰總數為 2^n)。

在這個例子中,隨機選中的金鑰恰為正確金鑰的機率是 1/2^n——也就是成功事件數(1 把秘密金鑰)除以可能事件數(2^n 把可能金鑰)。對 128 或 256 這類常見金鑰長度而言,1/2^n 小到可以忽略。

若某事件的機率為 p,則該事件發生的機率為 1 − p。因此上例中猜到錯誤金鑰的機率是 1 − 1/2^n,一個非常接近 1 的數字,意味著幾乎必然。