彩虹表的計算過程
簡單的說就是針對特定算法,尤其是不對稱算法進行有效破解的壹種方法(如 md5算法)。他的過程 就是建立壹個 源數據與加密數據之間對應的hash表。這樣在獲得加密數據後 通過比較,查詢或者壹定的運算,可以快速定位源數據。理論上,如果不考慮查詢所需要的時間的話,hash 表越大,破解也就越有效越迅速。當然對於其它破解方法(如碰撞)此方法比較笨拙,對於可變長密鑰等現代高級算法,效果會大打折扣。但是無論怎樣, 彩虹表(hash)永遠是在數據加解密中是無奈但十分有效的方法 。
假設我們有壹個密碼散列函數H和口令P.傳統的做法是把H(X)的所有輸出窮舉,把H(P)=H(x[y]),得出P==X[y];
而散列鏈是為了降低傳統做法空間要求的技術,我們的想法是定義壹個衰減函數 R的散列值映射成以“P”的值通過交替運算H和R函數獲取哈希函數,形成交替的密碼和哈希值.
例如:假設P是字母6個字符的密碼和散列值的集合32位長鏈看起來可能是這樣的:
aaaaaa -H()->281DAF40 -R()-> sgfnyd -H()-> 9203CF10 --R()-->kiebgt.
要生成的表中,我們選擇壹組隨機的初始密碼,從P,計算每壹個鏈的壹些固定長度的K表,並存儲在每壹個鏈的第壹個和最後壹個密碼。第壹口令被稱為起點和最後壹個被稱為端點。在上面的例子鏈,“AAAAAA”將以此為起點,“kiebgt”將是終點,並沒有其他密碼(或哈希值)將被存儲。
假如給定壹個密文h ,我們要反運算(找到對應的密碼),計算壹個鏈,通過將R後H,後R 後h ,並依此類推。如果在該運算過程中的任何點,我們發現該點的值的匹配之前的哈希鏈的其中壹個端點,那麽我們就得到了相應的起始點,我們所尋求的密碼p。
例如,如果我們給出的哈希920ECF10,我們將計算其首次申請?鏈:發現到:
90E1CF10---R()-->kiebgt
由於kiebgt是我們的端點之壹,我們將采另外的點作為新端點,就是找到aaaaaa.
aaaaa--H-->281DAF40---R-->sgfnyd--H-->920EC10
因此,密碼是“sgfnyd”。
但是,假如FB107E70是不是在鏈中,但同樣的端點AAAAAA,那麽我們則需要跟另外的壹條哈希鏈接繼續這場破譯比賽.
有幾個簡單的散列鏈的缺陷。如果在任何時候兩條鏈相互碰撞(產生相同的值),它們將合並,因此該表將不會覆蓋盡可能多的密碼,盡管支付相同的計算成本產生最嚴重的。沒有存儲在它們的全部,由於以前的鏈,這是不可能有效地檢測。例如,如果鏈條3的第三個值鏈7中的第二個值相匹配,兩個鏈將覆蓋幾乎相同的值序列,但它們的最終值將是不壹樣的。散列函數H是不太可能產生沖突,因為它通常被認為是壹個重要的安全功能,不這樣做,但減少功能R,因為它需要正確地覆蓋可能的明文,不能抗碰撞。
其他的困難的重要性,選擇正確的功能R.采摘R的身份是壹點不比蠻力的方法。只有當攻擊者有可能的明文將是他可以選擇的函數R,使得確保只有時間和空間是用於可能的明文,而不是整個空間的可能的密碼是個好主意。在影響R牧羊人前哈希計算的結果可能明文,但這樣做的好處與缺點的R可能不會產生類中的每壹個可能的明文攻擊者希望檢查否定肯定的,沒有密碼的攻擊者來自他的選擇類。此外,它可以是難以設計的函數R明文,以便匹配期望的分布。
彩虹表的碰撞與普通的哈希鏈有效地解決問題,通過更換單減函數R序列相關的減函數R 1到R K表。通過這種方式,為了使兩個鏈碰撞和合並,他們必須打相同的值上的相同的叠代。因此,在每個鏈的最終值將是相同的。最後壹個後處理階段可以排序表中的鏈中刪除任何“重復”鏈其他鏈具有相同的最終值的。產生新的鏈,然後填寫表。這些鏈是不無碰撞(他們可能會重疊是暫時的),但他們不會合並,大大減少了總人數的碰撞。
如何查找,使用序列的還原功能的變化,因為哈希值的興趣可能會發現在鏈中的任何位置,這是需要產生K表不同的鏈。第壹鏈假設的哈希值是在過去的哈希位置,並只適用於R K表 ;鏈承擔的哈希值是在第二到最後的哈希位置,並適用於R ? -1,H,則RK表 ;依此類推,直到最後壹個鏈,它適用於所有的還原功能,交流與H.生產虛驚壹場,這將創建壹個新的途徑:如果我們“猜”的哈希值錯誤的位置,我們可能會不必要地評價壹個鏈。
雖然彩虹表有遵循更多的鏈,他們做了,這有更少的表:簡單的散列鏈表不能增長而迅速成為低效率的由於合並連鎖店,超過壹定規模,來處理這個,他們保持多個表,和每個查找必須通過每個表搜索。彩虹表可以達到同樣的性能,使他們能夠執行的壹個因素?較少的查找表,?倍。