簡單了解MD5算法的原理

MD5的全稱是Message-Digest Algorithm,是Hash算法中的一種重要算法,具有單項(xiàng)加密、加密結(jié)果唯一、安全性能好等特點(diǎn)。MD5以512位分組來處理輸入的信息 ,且每一分組又被劃分為16個 32位子分組,經(jīng)過了一系列的處理后 ,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。

MD5算法流程圖

(1)信息填充

首先需要對明文信息進(jìn)行填充,使其位長度對512求余的結(jié)果等于448。因此,信息的位長度(Bits Length)將被擴(kuò)展至 N*512 + 448。然后,再在這個結(jié)果后面附加一個以64位二進(jìn)制表示的填充前信息長度。經(jīng)過這兩步的處理 ,現(xiàn)在的信息字節(jié)長度為 N*512 + 448 + 64 = (N + 1) *512,即長度恰好是 512的整數(shù)倍。

(2)結(jié)構(gòu)初始化

在處理過程中需要定義一個結(jié)構(gòu)。該結(jié)構(gòu)包含了每一次需要處理的一個明文塊 (512bit)和計(jì)算出來的散列值 (128bit)。在散列的整個過程中,它的作用非常重要 ,各個明文塊計(jì)算出來的散列值都是通過它來傳遞的。

(3)分組文件

將填充好的文件進(jìn)行分組 ,每組 512位 ,共有N組。

(4)處理分組

使用算法處理每組數(shù)據(jù)。

MD5算法在計(jì)算時會用到四個32位被稱作鏈接變量 (Chaining Variable)的整數(shù)參數(shù) ,在使用之前要對它們賦初值 ,分別就為 :

A = 0x01234567,B = 0x89abcdef, C = 0xfedcba98,D =0x76543210。

當(dāng)設(shè)置好這四個鏈接變量后,就開始進(jìn)入算法的四輪循環(huán)運(yùn)算。循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。

將上面四個鏈接變量復(fù)制到另外四個變量中 :A到 a,B到 b, C到 c,D到 d。

主循環(huán)有四輪,每輪循環(huán)都很相似。第一輪進(jìn)行16次操作。每次操作對 a、b、c和 d中的其中三個作一次非線性函數(shù)運(yùn)算 ,然后將所得結(jié)果加上第四個變量,一個子分組和一個常數(shù)。再將所得結(jié)果向右環(huán)移一個不定的數(shù),并加上 a、b、c或 d中之一,最后用該結(jié)果取代 a、b、c或 d中之一。

(5)輸出結(jié)果

當(dāng)全部信息處理完成后 ,將分組處理的結(jié)果進(jìn)行處理,輸出計(jì)算結(jié)果。

所有這些完成之后 ,將 A、B、C、D分別加上 a、b、c、d。然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行算法 ,最后的輸出是 A、B、C和 D的級聯(lián)。當(dāng)全部分組處理完成后,將結(jié)果級聯(lián) ,即得到了 MD5處理的結(jié)果。