SSL/TLS協議安全系列:再見,RC4

wyzsk發表於2020-08-19
作者: GoSSIP_SJTU · 2015/10/26 10:28

0x00背景


RC4是美國密碼學家Ron Rivest在1987年設計的金鑰長度可變的流加密演算法。它加解密使用相同的金鑰,因此也屬於對稱加密演算法。RC4曾被用在有線等效加密(WEP)中,但由於其錯誤的使用的方式已被有效破解,而如今,它又被TLS協議所放棄。

在2015年2月釋出的RFC7465中,RC4密碼套件被禁止在TLS各版本的客戶端和服務端使用。客戶端禁止在ClientHello中包含RC4套件,服務端禁止從ClientHello中提供的密碼套件中選擇RC4,如果客戶端只提供了RC4,服務端必須終止握手。另外,谷歌、微軟、Mozilla也宣佈將於明年年初在各自的瀏覽器中停止對RC4的支援。

從1994年RC4被匿名公開在Cypherpunks郵件列表,到如今RC4被TLS協議放棄,安全研究員們做出了很多貢獻。

0x01 RC4


RC4演算法分為兩個部分。第一部分是金鑰排程演算法(key-scheduling algorithm),根據key初始化S盒,第二部分是偽隨機數生成演算法(Pseudo-random generation algorithm),生成金鑰流,同時更新S盒的狀態。

金鑰排程演算法:

Input: 金鑰K ,K長度L位元組
Output:初始化後的S盒子
For i=0 to 255 do
    S[i] = i
j=0
for i=0 to 255 do
    j = ( j+S[i]+key[i mod L] )mod 256
    Swap(S[i],S[j])
Return S

偽隨機數生成演算法:

Input: S盒
Output:生成的金鑰流
i=0
j=0
while GeneratingOuput
    I = (i+1) mod 256
    j = (j+S[i]) mod 256
    Swap(S[i],S[j])
    Z = S[ (S[i]+S[j]) mod 256]
    Output z

金鑰key實際可用的長度最大為256位元組,但典型的長度是40-128 bit。

0x02 偏移


Rc4的最初若干位元組金鑰流的非均勻分佈

1. 單位元組偏移

在金鑰隨機的前提下,如果金鑰流是均勻的話,每個位元組出現的機率應該是1/256=0.3906%,但從理論分析和實驗結果來看,金鑰流某些位置上的某些位元組出現的機率要明顯高於(或低於)其他位元組,即偏移(biase)

RC4單位元組偏移現象最初由Mantin and Shamir等人發現。他們指出金鑰流的第二個位元組,Z2=0的機率約為1/128,而不是1/256

在S盒初始化結束,生成金鑰流的過程中,假設S2=0,S1=X≠2,S[X]=Y,根據偽隨機數生成演算法,第一輪,S[X]和S1互換,生成的金鑰位元組是S[X+Y];第二輪,S2和S[X]互換,生成的金鑰位元組是S[X]=0,即Z2=0。

由條件機率公式,計算出z2=0的機率約為1/128

P[z2 = 0] =  P[z2 = 0|S[2]= 0] * P[S[2]= 0] 
+ P[z2 = 0|S[2] ≠ 0] * P[S[2] ≠ 0]
             ≈ 1*1/256 + 1/256*(1-1/256)
             ≈ 1/128

實驗結果表明其他位置處的金鑰位元組也存在偏移現象。

單位元組偏移的侷限性在於偏移現象只在初始的約256個位元組出現。

2. 多位元組偏移

多位元組偏移又稱long term biase,一些位元組對出現的機率高於其他位元組,會在金鑰流中週期性的出現,最初由Fluhrer 和McGrew等人發現。

3. RC4NOMORE

2015年Mathy Vanhoef及Frank Piessens發表了對RC4新的攻擊方法,他們發現了新的偏移,只需要約9*2^27個密文就可以使cookie破解成功率達到94%,破解時間為75小時。這是第一個被證實可行的此類攻擊。他們的論文《All Your Biases Belong to Us: Breaking RC4 in WPA-TKIP and TLS》發表在USENIX Security2015,並被評為Best Student Paper

0x03 機率


學過機率與統計課程的同學應該對下面的題目有印象

“隨機拋n次硬幣,求恰好出現m次正面向上的機率”

這個機率符合二項分佈,每次實驗只有兩種可能的結果。二項分佈的名字來源於其機率公式符合二項展開的公式。

每次實驗,兩種結果出現的機率分別為a和b,重複實驗n次,展開式中的每一項都是一個獨立事件,如n*a^(n-1)*b表示第一種結果發生了n-1次,第二種結果發生了1次,這個現象發生的機率是n*a^(n-1)*b

將兩種結果推廣到更多的結果,就產生了多項分佈。

“隨機拋n次正方體骰子,點數1-6出現的次數分別為(x1,x2,x3,x4,x5,x6)的機率是多少,其中x1+x2+x3+x4+x5+x6=n”

更一般的情況是不規則的骰子。這種機率仍然符合多項展開公式

基於機率論的相關公式,我們就可以利用RC4金鑰流中的偏移特性,對明文某一位元組出現的機率進行計算,從而攻破RC4.

在預處理階段,透過大量的實驗,生成隨機的key,統計金鑰流中各位元組出現的機率,類似求出前面多項展開式中的p1,p2

在獲取密文階段,透過一些手段,不斷用RC4加密同樣的明文,記錄出現的密文.類似求出前面多項展開式中的n1,n2

最後,計算明文各個位元組的機率,從機率較高的候選位元組中恢復明文。

最後給出針對單位元組偏移的明文機率估計的整體演算法。

實驗結果:當蒐集的密文數為2^26時,前96個位元組恢復的機率均超過50%;當密文數為2^32時,恢復的機率基本為100%。

對於多位元組偏移,還要用到更加複雜的機率公式,在此就不詳細介紹了,但總體的思路還是一樣的。此外,針對HTTP cookie,有簡化運算的條件,如cookie欄位總是以“Cookie:”開頭,以換行符結尾,大部分cookie中的字元都是16進位制字元。有興趣的同學可以參考USENIX security2013年的論文《On the Security of RC4 in TLS and WPA》

0x04 結語


或許有人會說,“既然金鑰流初始的若干位元組有偏移問題,拋棄那些位元組不就可以繼續用了麼?”的確,RC4後來也出現了拋棄初始位元組的版本RC4-drop N,但有問題的原始版本已經被大範圍實現和部署,RC4的速度優勢在當今硬體條件下也不是特別重要,因此TLS協議放棄RC4是一個方便、安全的選擇。

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章