一路學(xué)來 記得筆記不少 但是給自己看 當(dāng)時(shí)就記得很隨意 以為后面都懂 但還是太單純了,現(xiàn)在回顧 自己都完全看不下去,所以以后的都放的博客上,讓自己看懂,讓感興趣的看懂,詳細(xì),暴力 不廢話了
MD5算法詳解
0x01定義:網(wǎng)上很多啊
MD5算法是單向散列算法的一種。單向散列算法也稱為HASH算法,是一種將任意長(zhǎng)度的信息壓縮至某一固定長(zhǎng)度(稱之為消息摘要)的函數(shù)(該壓縮過程不可逆)
我們是對(duì)一個(gè)字符串進(jìn)行MD5加密,所以我們先從字符串的處理開始。首先我們要知道一個(gè)字符的長(zhǎng)度是8位(bit),即一個(gè)字節(jié)的長(zhǎng)度。現(xiàn)在我們要做的就是將一個(gè)字符串Str1分割成每512位為一個(gè)分組,形如N*512+R,最后多出來的不足512位的R部分先填充一個(gè)1,再接無數(shù)個(gè)0,直到補(bǔ)足512位。這里要注意,R為0時(shí)也要補(bǔ)位,這時(shí)候補(bǔ)512位,最高位1,形如1000…00;如果R超出448,除了要補(bǔ)滿這個(gè)分組外,還要再補(bǔ)上一個(gè)512位的分組(因?yàn)槌^448位則不能留64位出來存放字符串的原長(zhǎng))。
接著,講講將字符串分塊保存部分。一個(gè)512位的字符串分組要分成16個(gè)32位的子分組,在每個(gè)32位中,以字節(jié)為單位通過小端規(guī)則存入一個(gè)32位的變量中,可以考慮用int類型的變量(一個(gè)int變量32位),也可以考慮用unsigned int,這樣之后涉及的循環(huán)移位就不用考慮符號(hào)位了,這里還是以int為例。因?yàn)橐粋€(gè)字符就是一個(gè)字節(jié)(8位),所以一個(gè)int類型變量能存放4個(gè)字符,假設(shè)一個(gè)字符