http://blog.csdn.net/cassie_huang/article/details/53212933
作者:無腦仔的小明?
出處:http://www.cnblogs.com/wunaozai/?
我們以一個字符串為例,新建一個文件filename.txt,在文件內寫入hello ,然后在Linux下可以使用命令md5sum filename.txt計算md5值 ==>?b1946ac92492d2347c6235b4d2611184 ?。雖然寫入的是hello這5個字符,但是我們使用命令xxd filename.txt后可以看出文件結尾處會有個0x0a這個回車符。所以在下面的代碼中才會有\n。
- ??
- ??
- int?MD5_Init(MD5_CTX?*c);??
- ??
- int?MD5_Update(MD5_CTX?*c,?const?void?*data,?size_t?len);??
- ??
- int?MD5_Final(unsigned?char?*md,?MD5_CTX?*c);??
- ??
- unsigned?char?*MD5(const?unsigned?char?*d,?size_t?n,?unsigned?char?*md);??
- ??
- void?MD5_Transform(MD5_CTX?*c,?const?unsigned?char?*b);??
新建一個cpp文件(C文件也可以)用于計算MD5值
- #include?<openssl/md5.h>??
- #include?<string.h>??
- #include?<stdio.h>??
- ??
- int?main()??
- {??
- ????MD5_CTX?ctx;??
- ????unsigned?char?outmd[16];??
- ????int?i=0;??
- ??
- ????memset(outmd,0,sizeof(outmd));??
- ????MD5_Init(&ctx);??
- ????MD5_Update(&ctx,"hel",3);??
- ????MD5_Update(&ctx,"lo\n",3);??
- ????MD5_Final(outmd,&ctx);??
- ????for(i=0;i<16;i<i++)??
- ????{??
- ????????printf("%02X",outmd[i]);??
- ????}??
- ????printf("\n");??
- ????return?0;??
- }??
編譯選項為: g++ MD5test.cpp -lssl -o MD5test(如果是C語言可以使用gcc?MD5test.c -o ?MD5test)
運行后的結果為:?B1946AC92492D2347C6235B4D2611184
注意這里用到openssl庫,可以自行根據網上教程安裝。
下面這個代碼是對文件進行MD5計算。
- #include?<openssl/md5.h>??
- #include?<string.h>??
- #include?<stdio.h>??
- ??
- int?main()??
- {??
- ????MD5_CTX?ctx;??
- ????unsigned?char?outmd[16];??
- ????char?buffer[1024];??
- ????char?filename[32];??
- ????int?len=0;??
- ????int?i;??
- ????FILE?*?fp=NULL;??
- ????memset(outmd,0,sizeof(outmd));??
- ????memset(filename,0,sizeof(filename));??
- ????memset(buffer,0,sizeof(buffer));??
- ????printf("請輸入文件名,用于計算MD5值:");??
- ????scanf("%s",filename);??
- ????fp=fopen(filename,"rb");??
- ????if(fp==NULL)??
- ????{??
- ????????printf("Can't?open?file\n");??
- ????????return?0;??
- ????}??
- ??
- ????MD5_Init(&ctx);??
- ????while((len=fread(buffer,1,1024,fp))>0)??
- ????{??
- ????????MD5_Update(&ctx,buffer,len);??
- ????????memset(buffer,0,sizeof(buffer));??
- ????}??
- ????MD5_Final(outmd,&ctx);??
- ??
- ????for(i=0;i<16;i<i++)??
- ????{??
- ????????printf("%02X",outmd[i]);??
- ????}??
- ????printf("\n");??
- ????return?0;??
- }??
運行得到結果后,我們可以使用md5sum命令進行驗證。
文章為轉載,略微改了幾個字眼。