MD5演算法實現

2021-09-02 16:42:23 字數 3073 閱讀 2540

md5.h

#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))

/* rotate_left 將x迴圈左移n位 */

#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) \

/*初始化md5的結構*/

void md5init(md5_ctx *context);

/*將與加密的資訊傳遞給md5結構,可以多次呼叫

context:初始化過了的md5結構

input:欲加密的資訊,可以任意長

inputlen:指定input的長度*/

void md5update(md5_ctx *context, unsigned char *input, unsigned int inputlen);

/*獲取加密 的最終結果

digest:儲存最終的加密串

context:你前面初始化並填入了資訊的md5結構*/

void md5final(md5_ctx *context, unsigned char digest[16]);

/*對512bits資訊(即block緩衝區)進行一次處理,每次處理包括四輪

state[4]:md5結構中的state[4],用於儲存對512bits資訊加密的中間結果或者最終結果

block[64]:欲加密的512bits資訊

*/void md5transform(unsigned int state[4], unsigned char block[64]);

/*位元組轉換函式

output:用於輸出的字元緩衝區

input:欲轉換的四位元組的整數形式的陣列

len:output緩衝區的長度,要求是4的整數倍

*/void md5encode(unsigned char *output, unsigned int *input, unsigned int len);

/*與上面相反的轉換函式

output:儲存轉換出的整數

input:欲轉換的字元緩衝區

len:輸入的字元緩衝區的長度,要求是4的整數倍

*/void md5decode(unsigned int *output, unsigned char *input, unsigned int len);

#endif

md5.c

#include #include "md5.h"

unsigned char padding = ;

/*初始化md5的結構*/

void md5init(md5_ctx *context)

/*將與加密的資訊傳遞給md5結構,可以多次呼叫

context:初始化過了的md5結構

input:欲加密的資訊,可以任意長

inputlen:指定input的長度*/

void md5update(md5_ctx *context, unsigned char *input, unsigned int inputlen)

else

/* buffer remaining input */

/*將輸入緩衝區中不足512bits的剩餘內容填充到context->buffer中,留待以後再作處理*/

memcpy(&context->buffer[index], &input[i], inputlen - i);

}/*獲取加密 的最終結果

digest:儲存最終的加密串

context:你前面初始化並填入了資訊的md5結構*/

void md5final(md5_ctx *context, unsigned char digest[16])

/*位元組轉換函式(unsigned int * to unsigned char *)

output:用於輸出的字元緩衝區

input:欲轉換的四位元組的整數形式的陣列

len:output緩衝區的長度,要求是4的整數倍

*/void md5encode(unsigned char *output, unsigned int *input, unsigned int len)

}/*與上面相反的轉換函式((unsigned char * to unsigned int *))

output:儲存轉換出的整數

input:欲轉換的字元緩衝區

len:輸入的字元緩衝區的長度,要求是4的整數倍

*/void md5decode(unsigned int *output, unsigned char *input, unsigned int len)}/*

對512bits資訊(即block緩衝區)進行一次處理,每次處理包括四輪

state[4]:md5結構中的state[4],用於儲存對512bits資訊加密的中間結果或者最終結果

block[64]:欲加密的512bits資訊

*/void md5transform(unsigned int state[4], unsigned char block[64])

test.cpp

#include #include #include extern "c"

;int main(int argc, char *argv)

putchar('\n');

return 0;

}

MD5演算法實現

md5.h 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...

java實現MD5演算法

public class md5 src class md5 static final byte padding private long state private long count private byte buffer public string digesthexstr private ...

md5演算法簡單實現

md5演算法步驟詳解 md5演算法的c 實現 看完網上文件後,主要的問題是,對於輸入的資訊你要怎麼進行補位這些操作啊?因為自己是渣渣,而且又沒有深究,所以就姑且用vector來實現了,也不夠優,還是有機會就再來優化吧!直接上 標頭檔案 mymd5.h ifndef mymd5 h define my...