彩虹表學習(0)

彩虹表在現代暴力破解中起到了舉足輕重的作用. 彩虹表構造的好壞直接關係到密碼破解的快慢. 接下來讓我

們一步一步瞭解彩虹表的原理, 最後目標是構造出自己的彩虹表.

說道彩虹表不得不提到Hellman大神在1980年提出的time-memory trade-off算法了

畢竟彩虹表就是對其理論的改良的工程實現.

對於密鑰空間大小爲N的密碼系統, 一般破解思路是想辦法使T(操作總時間)*M(內存總大小) = N.

這樣的話如果想讓M = 1那麼就變成了單純的暴力破解

如果想讓T = 1那麼就需要造一個內存空間大小等同與N的表

現代密碼設計的最基本的原則就是讓以上的兩種手段在可遇見的未來(密碼的有效期內)不可行

不過Hellman的time-memory trade-off選取m=t=n1/3 (這裏的m和t先不管其意義)

使其可以用M = m*t = N2/3 的內存空間,T=t2=N2/3 的操作時間在N的密鑰空間求出密鑰K

這樣的話在表已經建立的情況下相當於把原密碼體系的長度縮短了1/3

那麼我們先看下算法的大致流程.

設明文爲PCKS , C=Sk(P)

我們採取選擇明文攻擊,PCK

按常規思路我們要存儲的m*t次對K的嘗試結果的話那麼我們最終得到的有一個m*t的表, 其能付出O(1)的代價對結果進行查詢

不同的我們這次選取退化函數R, 其能把密文空間上元素映射到密鑰空間

我們再把RSk() 合併爲函數F, 性質F(K)=R(SK(P))

在N上選取不同的密鑰Ki ,其與P組成每行起始點SPi=Xi0

起始點之後的每一個Xij=F(Xi,j1)1<=j<=t

同理可推出第i行最終點EPi=Ft(SPi)

好了現在我們有了一個m*n的表, 但是我們只保留表的第一列(Xi0) 和最後一列(EPi )通過特別的查詢方式就得到了這個m*n表的查詢效果

如果我們用P得到了C, 我們要驗證密鑰K有沒有存在於我們的表中

Yi=R(C)i=1 驗證Yi 是否爲在EP

TRUE:
如果 Xi,t1 並不是真正的密鑰 或者 同時又多個EPi=Yi 那麼我們就遇到了一個false alarm(如何減少false alarm是其後續改進算法一個重要的問題)

FALSE:
那麼我們讓Yi+1 = F(Yi) 再次驗證, 直到驗證到t次或TRUE

從結果上來看, 雖然我們只保存了2*m個結構,但是通過退化函數R,我們只需要在查詢過程中引入少量的計算就相當於預存了一個m*t大小的表(最好情況)

這種通過函數的映射來縮小表的大小,提高破解效率的做法就是time-memory tarde-off的核心

不過因爲退化函數我們不能避免的會出現表中值得重疊問題(false alarm的產生的原因之一)

之後我們將看到作者如何通過理論證明如何選取m, t來保證破解的成攻率並證明重疊的問題對錶的有效性沒有很大影響

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章