实际序列密码
關于實際序列密碼
處理實際序列密碼的方法就是,用偽隨機數生成器替換真隨機密鑰序列位,其中密鑰k作為種子。
實際序列密碼的原理為:
而實際序列密碼并不是無條件安全的,實際上所以實際加密算法(序列密碼、分組密碼、公鑰算法)都不是無條件安全的。
我們能期待的最好結果就是計算安全。
計算安全
定義:
如果為破解一個密碼體制,最好的已知算法需要至少t個操作,則說明次密碼體制是計算安全的。
這個定義看起來合理,但仍然存在很多問題,首先,人們通常不知道對于給定的攻擊而言,最好的算法是哪一個。例如RSA公鑰,可以通過因式分解大整數破解。盡管很多因式分解算法都是已知的,但我們不知道是否存在更好的攻擊方法。
實際中可行的最好方法就是設計一個加密方案,并假設它是計算安全的。對于對稱密碼而言,這通常意味著希望窮盡密鑰搜索是最好的攻擊方法。
這個實際模仿了一次一密。優于OTP的地方在于,它只需要交換一次密鑰 ,并且該密鑰對長度不超過100位,而且不用與明文等長。
關于密鑰序列
關于Alice與Bob生成的密鑰序列s0,s1,…我們需要不同類型的隨機數生成器生成密碼序列。
我們不能使用TRNG,因為根據定義Alice和Bob不可能生成一樣的密鑰序列。相反我們需要確定的數字生成器,即偽隨機數。
兩種生成器:
下面這個想法看上去很有希望(實際沒啥用),許多PRNG都具有良好的統計屬性,這對強壯的序列密碼而言是非常必要的。如果我們對密碼流序列進行統計檢測,其輸出結果的行為表現應該與拋硬幣類似。
因此,自然而然假設,PRNG可以用來生成密碼流,但是,所有這些對序列密碼而言都不足夠,因為攻擊者Oscar也很聰明。
考慮以下這種攻擊方式:
假設一個基于線性同余發生器的PRNG:
S0=seed
Si+1≡A Si+B mod m,i=0,1,…
其中m為100位長,Si,A,B∈{0,1,…,m-1}。
如果我們仔細選擇這些參數,此PRNG將會擁有良好的統計屬性。
模數m是加密的一部分,而且是公開的。
密鑰包含值(A,B),也可能包含種子S0,并且每個值的長度均為100位。則總密鑰長度為200位,此長度已經足夠抵御蠻力攻擊。
由于這是一個序列密碼,Alice可以通過yi≡xi+si mod 2來獲得。
假設Oscar已知明文的錢300位(例如頭文件),或者他猜出了部分明文。
由于他知道密文,所以他現在可以利用si≡yi+xi mod m,i=0,1, … ,300來計算密鑰序列前300位,S1={s1,s2, … ,s100},S2={s101, … ,s200},S3={S201, … ,s300},RNG前三個輸出符號。
現在Oscar有兩個等式:S2≡A S0+B mod m;S3≡A S2+B mod m。
解得:A≡(S2-S3)/(S1-S2) mod m
B≡S2-S1(S2-S3)/(S1-S2) mod m
在gcd((S1-S2),m)≠1的情況下,可以得到多個解。而如果已知明文第四片信息的話,就可以唯一確定密鑰。
因此,概括地講,如果已知一些明文片段,我們就可以計算出密鑰,并解密整個密文。
為了抵抗上述攻擊,我們可以使用CSPRNG,因為它可以確保密鑰序列是不可預測的。
密鑰流不可預測意味著,給定密鑰對前n位輸出位,不可能計算出后面的位。
而相當一部分偽隨機數生成器都不是密碼學安全的。因此,實際中我們需要使用專門設計的偽隨機數生成器來生成序列密碼。
實際中的序列密碼大致可以分為兩種:針對軟件實現優化的密碼和針對硬件實現優化的密碼。第三種序列密碼,是將分組密碼作為基本塊來實現的。
目前,科學家設計更安全的分組密碼看上去比序列密碼要更容易一些。
總結
- 上一篇: 随机数与一次一密
- 下一篇: 基于移位寄存器的序列密码