摘要算法MD5
摘要算法MD5是MD4算法的一個(gè)修改版本,雖然算法速度降低了,但安全性有所提升。后來的SHA-1和SHA-2都基于MD4開發(fā),所以這些算法的結(jié)構(gòu)都是相似的。算法內(nèi)部維護(hù)128位的輸出緩存、512位輸入緩存、64位的數(shù)據(jù)長度和128位的臨時(shí)值,描述如下:
(1)消息長度被擴(kuò)增至512(64字節(jié))的整數(shù)倍余448位(56字節(jié)),如果擴(kuò)增前數(shù)據(jù)長度小于56字節(jié),就將最后一個(gè)字節(jié)設(shè)為0x80,然后將直至56字節(jié)的全部設(shè)為0。反之如果大于56字節(jié),就將最后一個(gè)字節(jié)設(shè)為0x80,再將這64字節(jié)輸入緩存中剩下的數(shù)據(jù)設(shè)為0,然后重開,56字節(jié)數(shù)據(jù)。
(2)填充后的數(shù)據(jù)必然是512的整數(shù)倍余448位,然后將數(shù)據(jù)長度(RFC 1321有個(gè)巨坑,數(shù)據(jù)長度是按位數(shù)計(jì)算的,不是按字節(jié))填充至剩下的64位里面,這時(shí)長度就變成512的整數(shù)倍了。
(3)將128位輸出緩存按小端初始化為:
(4)定義F、G、H、I四種運(yùn)算:
(5)定義32位移位運(yùn)算和FF、GG、HH、II四種運(yùn)算:
(6)輸入緩存按512位為一組,參與輸出緩存的64次輪運(yùn)算(各16次FF、GG、HH、II)。
(7)輸出128位輸出緩存。
C++實(shí)例如下,老規(guī)矩使用流式計(jì)算方法,能夠輸入任意長度的數(shù)據(jù):