随机数与一次一密
隨機數
序列密碼的安全性完全取決于密鑰序列,所以隨機數非常重要。
隨機數生成器
1. 真隨機數生成器(TRNG)
真隨機數的突出特點是它的輸出是不可復制的。真隨機數生成器都是基于物理過程,例如拋硬幣、擲骰子等。
密碼學中通常使用TRNG用于生成回話密鑰。
2. (通用的)偽隨機數生成器(PRNG)
偽隨機數生成器從一個初始種子值開始通過各種計算得到序列。通常使用遞歸得到:
s0=seed
si+1=f(si),i=0,1,…
此表達式的一個推廣形式就是si+1=f(si,si-1,…,si-t)所示的生成器,其中t是一個固定整數。最常見的就是線性同余生成器:
s0=seed
si+1=a si+b mod m,i=0,1,…
其中a,b,m都是整型常量。
注意,PRNG不是真正意義上的隨機,它是通過計算得到的。例如ANSI C中的rand()函數,它的參數s0=12345,a=1103515245,b=12345,m=231。
PRNG都被要求具有良好的統計屬性,意味著它的輸出近乎跟真隨機數相同。
除了密碼學外,偽隨機數在其他很多地方也應用廣泛。
3. 加密安全的偽隨機數生成器(CSPRNG)
它是PRNG的一個特例,它是一種不可預測的PRNG。
也就是說,給定密鑰序列的其中一部分,不能預測到其他部分,或者是不存在任何一種算法會使成功預測的概率大于50%。
不過,只有密碼學中才要求CSPRNG具有不可預知性,在幾乎所有的計算機科學或計算機工程的情況中都需要偽隨機數,但并不要求其具有不可預知性。
一次一密
無條件安全的定義
如果一個密碼體制在無限計算資源的情況下也不能破譯,則說明它是無條件安全的或信息理論上是安全的。
一次一密的定義
一個序列密碼被稱為一次一密,必須滿足一下條件:
一次一密是無條件安全的。
無條件安全基于信息理論,并對攻擊者的計算能力沒有限制。則,對一個對稱加密算法進行蠻力攻擊,即使一個密鑰長度足夠長,也只有可能是計算安全的,而不是無條件安全的。
證明OTP是無條件安全的:
對每個密文位,可得到以下形式的等式:
y0 ≡ x0 + s0 mod 2
y1 ≡ x1+ s1 mod 2
……
即使攻擊者知道了y0的值,也無法確定x0。如果s0來自一個真隨機源,且值為0和1的概率都是50%,則x0為0和1的概率也完全相同;而如果si不是真隨機數,則情況完全不同,x0與y0之間將存在一定的函數關系,即使求解等式系統會很困難,但它卻不是可證明安全的了。
而如果使用OTP,則需要滿足那三個條件,第一個:要用TRNG的話,可以用基于半導體白噪音的設備,雖然不容易實現,但開始可以實現的。第二個條件,需要Alice將此隨機位安全的傳給Bob,意味著Alice要將真隨機位燒錄到CD ROM(只讀光盤)中,并將此CD ROM安全送至Bob。第三個條件可能是最不切實際的一個:密鑰序列位不能被重復,這意味著每個明文位都需要有一個密鑰位!也就是說一次一密的密鑰長度要跟明文長度一樣長。這也許是OTP最大的缺點,因為長度不同的明文需要更換長度不同的密鑰。
因此OTP在現實中很少用,但它為安全密碼提供了很好的設計思路,例如將真隨機位與明文進行XOR(異或)操作。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結