1. 程式人生 > >使用openssl的md5庫

使用openssl的md5庫

在linux機器上,有一個命令可以計算出檔案的md5值,那就是md5sum,如果沒有的話,就需要安裝RPM包:coreutils。

現在我們使用openssl的庫也可以方便的計算出檔案的md5值。主要用到的函式是

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

使用庫前,先需要安裝openssl的RPM包。這三個函式不需要解釋,看下面一個例子就知道:

  1. #include <openssl/md5.h>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <iomanip>
  5. #include <stdlib.h>
  6. usingnamespace std;  
  7. int main()  
  8. {  
  9.         FILE *fd=fopen("test","r");  
  10.         MD5_CTX c;  
  11.         unsigned char md5[17]={0};  
  12.         if(fd == NULL)  
  13.         {  
  14.                 cout << "open failed"
     << endl;  
  15.                 return -1;  
  16.         }  
  17.         int len;  
  18.         unsigned char *pData = (unsigned char*)malloc(1024*1024*1024);  
  19.         if(!pData)  
  20.         {  
  21.                 cout << "malloc failed" << endl;  
  22.                 return -1;  
  23.         }  
  24.         MD5_Init(&c);  
  25.         while( 0 != (len = fread(pData, 1, 1024*1024*1024, fd) ) )  
  26.         {  
  27.                 MD5_Update(&c, pData, len);  
  28.         }  
  29.         MD5_Final(md5,&c);  
  30.         for(int i = 0; i < 16; i++)  
  31.                 cout << hex << setw(2) << setfill('0') << (int)md5[i];  
  32.         cout << endl;  
  33.         fclose(fd);  
  34.         free(pData);  
  35.         return 0;  
  36. }  

編譯連結選項為:

g++ test.cpp -o testmd5 -lcrypto -lssl

生成testmd5後,我們把一個300多M的test檔案放到與testmd5一個目錄。並把testmd5生成的結果和linux命令"md5sum test" 結果對比,會發現是一樣的。如下圖:


有興趣可以參考openssl原始碼