密碼系統高度仰賴高品質的亂數。在本章中,你會看到亂數被用作每次連線的工作階段金鑰(per-session key)、初始化向量(initialization vector),以及 RSA 演算法所需的大質數 p 與 q。
然而取得真正隨機的資料很困難,因為電腦本質上是決定性(deterministic)的:給定相同的輸入與狀態,程式理應產生相同的輸出。
一種產生相對不可預測資料的方式是取樣物理過程(sampling physical processes),例如計時使用者的鍵盤按鍵間隔,或取樣電氣雜訊(如電阻的熱雜訊)。
這類物理來源的問題是產出的資料量太少——頂多每秒數百位元組,對通用密碼系統而言遠遠不足。光是一把 4096 位元的 RSA 金鑰,就至少需要兩個隨機的 256 位元組數字,要花上好幾秒才能產生。
為了讓有限的取樣資料發揮更大效用,密碼函式庫會實作偽亂數產生器(pseudorandom number generator, PRNG):它以一個初始種子值(seed)出發,產生一連串在理論上(不知道產生器內部狀態時)不可預測的數字。
PRNG 的品質在不同函式庫之間差異極大。C 函式庫的
rand()函式對於密碼學等級的安全協定而言完全不堪使用。用弱演算法為密碼用途產生亂數,是常見卻致命的錯誤。