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