MD5加密C實現

2021-06-20 23:58:07 字數 4120 閱讀 5570

md5加密演算法實現:

#include #include /*                 md5.h           */ 

#ifndef _md5_h_

#define _md5_h_

#define r_memset(x, y, z) memset(x, y, z)

#define r_memcpy(x, y, z) memcpy(x, y, z)

#define r_memcmp(x, y, z) memcmp(x, y, z)

typedef unsigned long uint4;

typedef unsigned char *pointer;

/* md5 context. */

typedef struct md5_ctx;

void md5init(md5_ctx *);

void md5update(md5_ctx *, unsigned char *, unsigned int);

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

#endif /* _md5_h_ */

////* md5.cpp */

/* constants for md5transform routine. */

/*md5轉換用到的常量,演算法本身規定的*/

#define s11 7

#define s12 12

#define s13 17

#define s14 22

#define s21 5

#define s22 9

#define s23 14

#define s24 20

#define s31 4

#define s32 11

#define s33 16

#define s34 23

#define s41 6

#define s42 10

#define s43 15

#define s44 21

static void md5transform(uint4 [4], unsigned char [64]);

static void encode(unsigned char *, uint4 *, unsigned int);

static void decode(uint4 *, unsigned char *, unsigned int);

/*用於bits填充的緩衝區,為什麼要64個位元組呢?因為當欲加密的資訊的bits數被512除其餘數為448時,

需要填充的bits的最大值為512=64*8 。

*/static unsigned char padding[64] = ;

/*接下來的這幾個巨集定義是md5演算法規定的,就是對資訊進行md5加密都要做的運算。

據說有經驗的高手跟蹤程式時根據這幾個特殊的操作就可以斷定是不是用的md5

*//* f, g, h and i are basic md5 functions.

*/#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 rotates x left n bits.

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

/* ff, gg, hh, and ii transformations for rounds 1, 2, 3, and 4.

rotation is separate from addition to prevent recomputation.

*/#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 initialization. begins an md5 operation, writing a new context. */

/*初始化md5的結構*/

void md5init (md5_ctx *context)

/* md5 block update operation. continues an md5 message-digest

operation, processing another message block, and updating the

context. */

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

context:初始化過了的md5結構

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

inputlen:指定input的長度

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

else

i = 0;

/* buffer remaining input */

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

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

}/* md5 finalization. ends an md5 message-digest operation, writing the

the message digest and zeroizing the context. */

/*獲取加密 的最終結果

digest:儲存最終的加密串

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

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

/* md5 basic transformation. transforms state based on block. */

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

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

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

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

/* encodes input (uint4) into output (unsigned char). assumes len is

a multiple of 4. */

/*將4位元組的整數copy到字元形式的緩衝區中

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

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

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

*/static void encode(unsigned char *output, uint4 *input,unsigned int len)

}/* decodes input (unsigned char) into output (uint4). assumes len is

a multiple of 4. */

/*與上面的函式正好相反,這乙個把字元形式的緩衝區中的資料copy到4位元組的整數中(即以整數形式儲存)

output:儲存轉換出的整數

input:欲轉換的字元緩衝區

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

*/static void decode(uint4 *output, unsigned char *input,unsigned int len)

//int main(int argc, char* argv)

C 實現MD5加密

方法一 首先,先簡單介紹一下md5 md5的全稱是message digest algorithm 5 資訊 摘要演算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l.rivest開發出來,經md2...

C 實現MD5加密

首先,先簡單介紹一下md5 md5的全稱是message digest algorithm 5 資訊 摘要演算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l.rivest開發出來,經md2 md3...

C 實現MD5加密

c 實現md5加密 首先,先簡單介紹一下md5 md5的全稱是message digest algorithm 5 資訊 摘要演算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l.rivest開發出...