Md5扩展攻击的原理和应用
*本文原創作者:Guilty and Innocent,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載
?
做CTF題目的過程中遇到了md5擴展攻擊,參考了幾篇文章,感覺寫的都有些小缺陷,再發一篇文章,理解md5擴展攻擊首先需要了解md5的工作原理。
1)md5的工作原理
具體參考這兩篇文章
http://blog.csdn.net/adidala/article/details/28677393,算法實現有誤
https://www.rfc-editor.org/rfc/pdfrfc/rfc1321.txt.pdf,算法正確
md5的算法原理如下圖所示
Md5的算法步驟是
1、填充
將數據進行填充,首先添加0×80,接著添加0×00使得 (數據字節數 + 8)%64 = 0
2、增加長度
將數據的長度放入8字節的數組中,把低字節放到前面,例如長度為1,8字節的數據長度表示為00 00 00 00 00 00 00 01,把這個長度值轉化為低字節在前面變成了01 00 00 00 00 00 00 00,將這個數據加入到整體的數據中。
3、進行輪次變換
以64個字節為1組進行輪次變換,這一組中以4字節為1個單位分成16個數字。
首先準備A,B,C,D四個32位的字符,其中,????A = 0×67452301,B = 0xefcdab89
,C = 0x98badcfe,D = 0×10325476, ??將ABCD作為種子,與16個數字進行一種復雜的運算(運算方式見后文),運算結果為A1 B1 C1 D1,以A1 B1 C1 D1為種子然后重復這個過程計算最后得到AnBnCnDn
4、輸出hash值
將An進行類似于第二步的低字節順序的排列An’,同理對Bn,Cn,Dn進行同樣變換,An’,Bn’,Cn’,Dn’的簡單拼接就是最后結果。
注:這里簡單記錄一下正確的復雜算法
文獻1中的算法是錯誤的,正確的算法是
定義其中幾個子算法F = lambda x,y,z:((x&y)|((~x)&z))G = lambda x,y,z:((x&z)|(y&(~z))) H = lambda x,y,z:(x^y^z) I = lambda x,y,z:(y^(x|(~z))) def shift(a, count): ????????return (((a << count) | (a >> (32 -count)))&0xffffffff) 常量表: T_func = lambda i: int(4294967296*abs(math.sin(i))) & 0xffffffff T = [T_func(i) for i in xrange(1, 65)] T.insert(0 , 0) 復雜算法為 ????????INPUT_A = A ????????INPUT_B = B ????????INPUT_C = C ????????INPUT_D = D ????????M = [ (myord[i * 64?+ j + 3] <<24) + ?(myord[i * 64?+ j + 2] << 16?)+ (myord[i * 64?+ j + 1] << 8) + (myord[i * 64?+ j + 0] )\ ?????????????for?j in?xrange(0, 64, 4)] ????????def?shift(a, count): ????????????return?(((a << count) | (a >> (32?-count)))&0xffffffff) ????????總結
以上是生活随笔為你收集整理的Md5扩展攻击的原理和应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot 项目页面显示不出
- 下一篇: 相亲聊什么?想要避免尬聊,就从这6个话题