(2)雜湊函式之MD5演算法

2021-10-01 03:01:49 字數 3659 閱讀 8179

常見的雜湊函式包括 md5,sha-1,sha-256,sha-512 等,今天講一下md5演算法

md5 演算法,又稱訊息摘要演算法,是一種被廣泛使用的密碼雜湊函式,可以產生出乙個 128 位(16 位元組)的雜湊值(hash value),用於確保資訊傳輸完整一致。md5 由美國密碼學家羅納德·李維斯特(ronald linn rivest)設計,完全符合 merkle-damgard 結構結構。該演算法於 1992 年公開,程式**在 rfc 1321 標準中被加以規範。1996 年後該演算法被證實存在弱點,可以被加以破解,在 2004 年 8 月的密碼學頂會 crypto2004 尚,來自中國的王小雲教授的研究成果證實了 md5 演算法存在碰撞。這一發現意味著採用 md5 演算法的數字簽名、完整性檢驗等資訊保安系統將不再安全了,因此對於需要高度安全性的資料,專家一般建議改用其他方法,如 sha-2

具體來說,首先,初始化 md 快取。使用乙個 128 位元快取

存放雜湊的中間和最後結果。快取表示為 4 個 32 位元的快取器

(a,b,c,d)

⚫ 初始化值(16 進製表示): a=67452301, b=efcdab89, c=98badcfe, d=10325476。

⚫ 初始化格式:小數在前的格式儲存,即字的低位位元組放在高位址位元組上,像 32 位的位元串:a:01 23 45 67,b:89 ab cd ef, c: ef dc ba 98, d: 76 54 32 10

其次,處理 512 位元(16 個字)報文分組。核心是乙個包含 4個迴圈的壓縮函式 f。4 個迴圈結構相似,但每次使用的原始邏

輯函式不同,分別記為 f,g,h,i。

⚫ 輸入:當前處理的 512 分組(yq)和 128 位元快取值abcd(即上一次迭代的輸出 cvq)。

⚫ 迴圈:使用表 t[1…64]的 1/4,該錶由正弦函式給出,即 t[i]=232×|sin(i)|的整數部分。

⚫ 輸出:第 4 次迴圈輸出加到第 1 次迴圈的輸入上產生 cvq+1。相加是快取中 4 個字分別與 cvq中對應的 4 個字以模 2^32相加。最後,所有 l 個 512 位元的分組處理完成後,第 l 個階段的輸出作為報文的 128 位元摘要。總結 md5 操作如下:

⚫ cv0=iv

⚫ cvq+1= sum32(cvq, rfi[yq, rfh[yq, rfg[yq, rff[yq, cvq]]]] )

⚫ md5=cvl

其中,sum32 =對輸入對中的每個字執行模 2^32加,iv=快取 abcd 的初值,第 3 步定義。yq=第 q 個長度為 512 位元的報文分組。l=報文的分組數,cvq =處理第 q 個報文分組是的連續變數,rfx =使用原始邏輯函式 x 的迴圈函式,md5=最終的報文摘要。

下面給出我們老師給的殘缺**,我還沒補充好,腦闊子疼,要是有大佬看出來**有問題麻煩告訴一下我,實在看不出來問題在**。。。淒淒涼涼。。。

#include

#include

"md5.h"

unsigned

char padding=

;void

md5init

(md5_ctx *context)

void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

else

memcpy

(&context->buffer[index]

,&input[i]

,inputlen-i);}

void

md5final

(md5_ctx *context,

unsigned

char digest[16]

)void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

}void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

}void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

)

#ifndef md5_h

#define md5_h

typedef

struct

md5_ctx;

#define f(x,y,z) ((x & y) | (~x & z))

#define g(x,y,z) ((x & z) | (y & ~z))

#define h(x,y,z) (x^y^z)

#define i(x,y,z) (y ^ (x | ~z))

#define rotate_left(x,n) ((x << n) | (x >> (32-n)))

#define ff(a,b,c,d,x,s,ac) \

#define gg(a,b,c,d,x,s,ac) \

#define hh(a,b,c,d,x,s,ac) \

#define ii(a,b,c,d,x,s,ac) \

void

md5init

(md5_ctx *context)

;void

md5update

(md5_ctx *context,

unsigned

char

*input,

unsigned

int inputlen)

;void

md5final

(md5_ctx *context,

unsigned

char digest[16]

);void

md5transform

(unsigned

int state[4]

,unsigned

char block[64]

);void

md5encode

(unsigned

char

*output,

unsigned

int*input,

unsigned

int len)

;void

md5decode

(unsigned

int*output,

unsigned

char

*input,

unsigned

int len)

;#endif

#include

#include

#include

"md5.h"

intmain

(int argc,

char

*ar**)

getchar()

;return0;

}

待我弄明白咋回事了再回來更。。。。。。

雜湊函式 MD5演算法

md5 通過4輪運算 每輪16步,共64步 將任意長的訊息壓縮成為乙個128bit的訊息摘要,使用了4個32bit的暫存器。md結構是基於迭代式結構來構造碰撞穩固的hash函式的方法,即通過某一碰撞穩固的壓縮函式 從較大的固定長度的輸入集合對映到相對小的有固定長度的輸出集合的函式 0,1?0,1?0...

雜湊函式之MD5

md5演算法是輸入長度小於2 64位元的訊息,輸出為128位元的訊息摘要。輸入訊息以512位元的分組為單位處理。具體過程如下 直接使用python中的hashlib模組,並將加密結果以16進製制形式顯示 import hashlib 生成md5數字指紋。s b abc 定義位元組型字串 md has...

MD5加密和雜湊演算法

md5加密演算法為現在應用最廣泛的雜湊演算法之一,該演算法廣泛應用於網際網路 的使用者檔案加密,能夠將使用者密碼加密為128位的長整數。資料庫並不明文儲存使用者密碼,而是在使用者登入時將輸入密碼字串進行md5加密,與資料庫中所儲存的md5值匹配,從而降低密碼資料庫被盜取後使用者損失的風險。md5加密...