md5 加密算法和升級

在這裏插一小節加密的吧,使用openssl庫進行加密。算法

使用MD5加密 函數

咱們以一個字符串爲例,新建一個文件filename.txt,在文件內寫入hello ,而後在Linux下能夠使用命令md5sum filename.txt計算md5值 ==> b1946ac92492d2347c6235b4d2611184  。雖然寫入的是hello這5個字符,可是咱們使用命令xxd filename.txt後能夠看出文件結尾處會有個0x0a這個回車符。因此在下面的代碼中才會有\n。加密

 1 //打開/usr/include/openssl/md5.h這個文件咱們能夠看到一些函數  2 // 初始化 MD5 Contex, 成功返回1,失敗返回0  3 int MD5_Init(MD5_CTX *c);  4 // 循環調用此函數,能夠將不一樣的數據加在一塊兒計算MD5,成功返回1,失敗返回0  5 int MD5_Update(MD5_CTX *c, const void *data, size_t len);  6 // 輸出MD5結果數據,成功返回1,失敗返回0  7 int MD5_Final(unsigned char *md, MD5_CTX *c);  8 // MD5_Init,MD5_Update,MD5_Final三個函數的組合,直接計算出MD5的值  9 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); 10 // 內部函數,不須要調用 11 void MD5_Transform(MD5_CTX *c, const unsigned char *b);

新建一個cpp文件用於計算MD5值spa

 1 #include <openssl/md5.h>
 2 #include <string.h>  3 #include <stdio.h>  4  5 int main()  6 {  7  MD5_CTX ctx;  8 unsigned char outmd[16];  9 int i=0; 10 11 memset(outmd,0,sizeof(outmd)); 12 MD5_Init(&ctx); 13 MD5_Update(&ctx,"hel",3); 14 MD5_Update(&ctx,"lo\n",3); 15 MD5_Final(outmd,&ctx); 16 for(i=0;i<16;i<i++) 17  { 18 printf("%02X",outmd[i]); 19  } 20 printf("\n"); 21 return 0; 22 }

編譯選項爲: g++ MD5test.cpp -lssl -o MD5testorm

運行後的結果爲: B1946AC92492D2347C6235B4D2611184md5

注意這裏用到openssl庫,能夠運行 yum install openssl  和 yum install openssl-devel 進行安裝。ssl

下面這個代碼是對文件進行MD5計算。字符串

 1 #include <openssl/md5.h>
 2 #include <string.h>  3 #include <stdio.h>  4  5 int main()  6 {  7  MD5_CTX ctx;  8 unsigned char outmd[16];  9 char buffer[1024]; 10 char filename[32]; 11 int len=0; 12 int i; 13 FILE * fp=NULL; 14 memset(outmd,0,sizeof(outmd)); 15 memset(filename,0,sizeof(filename)); 16 memset(buffer,0,sizeof(buffer)); 17 printf("請輸入文件名,用於計算MD5值:"); 18 scanf("%s",filename); 19 fp=fopen(filename,"rb"); 20 if(fp==NULL) 21  { 22 printf("Can't open file\n"); 23 return 0; 24  } 25 26 MD5_Init(&ctx); 27 while((len=fread(buffer,1,1024,fp))>0) 28  { 29 MD5_Update(&ctx,buffer,len); 30 memset(buffer,0,sizeof(buffer)); 31  } 32 MD5_Final(outmd,&ctx); 33 34 for(i=0;i<16;i<i++) 35  { 36 printf("%02X",outmd[i]); 37  } 38 printf("\n"); 39 return 0; 40 }

運行獲得結果後,咱們能夠使用md5sum命令進行驗證。openssl

使用SHA1加密string

  openssl裏幾個函數講解

 1 //SHA1算法是對MD5算法的升級,計算結果爲20字節(160位),使用方法以下:  2 //打開/usr/include/openssl/sha.h這個文件咱們能夠看到一些函數  3 // 初始化 SHA Contex, 成功返回1,失敗返回0  4 int SHA_Init(SHA_CTX *c);  5 // 循環調用此函數,能夠將不一樣的數據加在一塊兒計算SHA1,成功返回1,失敗返回0  6 int SHA_Update(SHA_CTX *c, const void *data, size_t len);  7 // 輸出SHA1結果數據,成功返回1,失敗返回0  8 int SHA_Final(unsigned char *md, SHA_CTX *c);  9 // SHA_Init,SHA_Update,SHA_Final三個函數的組合,直接計算出SHA1的值 10 unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); 11 // 內部函數,不須要調用 12 void SHA_Transform(SHA_CTX *c, const unsigned char *data); 13 14 //上面的SHA能夠改成SHA1,SHA224,SHA256,SHA384,SHA512就能夠實現多種加密了

咱們對上面的程序進行修改

 1 #include <openssl/sha.h>
 2 #include <string.h>  3 #include <stdio.h>  4  5 int main()  6 {  7  SHA_CTX stx;  8 unsigned char outmd[20];//注意這裏的字符個數爲20  9 char buffer[1024]; 10 char filename[32]; 11 int len=0; 12 int i; 13 FILE * fp=NULL; 14 memset(outmd,0,sizeof(outmd)); 15 memset(filename,0,sizeof(filename)); 16 memset(buffer,0,sizeof(buffer)); 17 printf("請輸入文件名,用於計算SHA1值:"); 18 scanf("%s",filename); 19 fp=fopen(filename,"rb"); 20 if(fp==NULL) 21  { 22 printf("Can't open file\n"); 23 return 0; 24  } 25 26 SHA1_Init(&stx); 27 while((len=fread(buffer,1,1024,fp))>0) 28  { 29 SHA1_Update(&stx,buffer,len); 30 memset(buffer,0,sizeof(buffer)); 31  } 32 SHA1_Final(outmd,&stx); 33 34 for(i=0;i<20;i<i++) 35  { 36 printf("%02X",outmd[i]); 37  } 38 printf("\n"); 39 return 0; 40 }

MD5有128bit(16個char)*SHA1有160bit(20個char)*SHA256有256bit(32個char)*SHA244有244bit(28個char)*SHA512有512bit(64個char).因此要注意修改大小哦:-O

相關文章
相關標籤/搜索