c語言 md5函式

2022-03-10 04:57:49 字數 1799 閱讀 4603

c語言md5函式原始碼

#include

#include

#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 rl(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) //

x向左迴圈移y位

#define pp(x) (x<<24)|((x<<8)&0xff0000)|((x>>8)&0xff00)|(x>>24) //

將x高低位互換,例如pp(aabbccdd)=ddccbbaa

#define ff(a, b, c, d, x, s, ac) a = b + (rl((a + f(b,c,d) + x + ac),s))

#define gg(a, b, c, d, x, s, ac) a = b + (rl((a + g(b,c,d) + x + ac),s))

#define hh(a, b, c, d, x, s, ac) a = b + (rl((a + h(b,c,d) + x + ac),s))

#define ii(a, b, c, d, x, s, ac) a = b + (rl((a + i(b,c,d) + x + ac),s))

unsigned a,b,c,d,a,b,c,d,i,len,flen[2],x[16]; //

i臨時變數,len檔案長,flen[2]為64位二進位制表示的檔案初始長度

char filename[200]; //

檔名file *fp;

void md5() //

md5核心演算法,供64輪

main()

fseek(fp, 0, seek_end); //

檔案指標轉到檔案末尾

if((len=ftell(fp))==-1)

rewind(fp); //

檔案指標復位到檔案頭

a=0x67452301,b=0xefcdab89,c=0x98badcfe,d=0x10325476; //

初始化鏈結變數

flen[1]=len/0x20000000; //

flen單位是bit

flen[0]=(len%0x20000000)*8;

memset(x,0,64); //

初始化x陣列為0

fread(&x,4,16,fp); //

以4位元組為一組,讀取16組資料

for(i=0; i64; i++) //

迴圈運算直至檔案結束

((char*)x)[len%64]=128; //

檔案結束補1,補0操作,128二進位制即10000000

if(len%64>55) md5(),memset(x,0,64);

memcpy(x+14,flen,8); //

檔案末尾加入原檔案的bit長度

md5();

fclose(fp);

printf("

md5 code:%08x%08x%08x%08x\n

",pp(a),pp(b),pp(c),pp(d)); //

高低位逆反輸出

}}

ps:偶在c語言論壇 - bccn論壇看到的,順手就貼了過來。

MD5 加密演算法 c語言

摘自openssl global.h ifndef prototypes define prototypes 0 endif pointer defines a generic pointer type typedef unsigned char pointer uint2 defines a tw...

md5的C 語言實現

include iostream include string include math.h using namespace std typedef char byte 初始化四個數 long a 0x67452301l long b 0xefcdab89l long c 0x98badcfel l...

MD5 使用C 語言實現

md5是一種訊息摘要演算法。include include include include include using namespace std typedef unsigned char uint8 typedef unsigned short uint16 typedef unsigned i...