在這里插一小節(jié)加密的吧,使用openssl庫(kù)進(jìn)行加密,。 使用MD5加密 我們以一個(gè)字符串為例,,新建一個(gè)文件filename.txt,在文件內(nèi)寫入hello ,,然后在Linux下可以使用命令md5sum filename.txt計(jì)算md5值 ==> b1946ac92492d2347c6235b4d2611184 ,。雖然寫入的是hello這5個(gè)字符,,但是我們使用命令xxd filename.txt后可以看出文件結(jié)尾處會(huì)有個(gè)0x0a這個(gè)回車符,。所以在下面的代碼中才會(huì)有\(zhòng)n,。 1 //打開(kāi)/usr/include/openssl/md5.h這個(gè)文件我們可以看到一些函數(shù) 2 // 初始化 MD5 Contex, 成功返回1,失敗返回0 3 int MD5_Init(MD5_CTX *c); 4 // 循環(huán)調(diào)用此函數(shù),可以將不同的數(shù)據(jù)加在一起計(jì)算MD5,成功返回1,失敗返回0 5 int MD5_Update(MD5_CTX *c, const void *data, size_t len); 6 // 輸出MD5結(jié)果數(shù)據(jù),成功返回1,失敗返回0 7 int MD5_Final(unsigned char *md, MD5_CTX *c); 8 // MD5_Init,MD5_Update,MD5_Final三個(gè)函數(shù)的組合,直接計(jì)算出MD5的值 9 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); 10 // 內(nèi)部函數(shù),不需要調(diào)用 11 void MD5_Transform(MD5_CTX *c, const unsigned char *b); 新建一個(gè)cpp文件用于計(jì)算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 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 } 編譯選項(xiàng)為: g++ MD5test.cpp -lssl -o MD5test 運(yùn)行后的結(jié)果為: B1946AC92492D2347C6235B4D2611184 注意這里用到openssl庫(kù),可以運(yùn)行 yum install openssl 和 yum install openssl-devel 進(jìn)行安裝,。 下面這個(gè)代碼是對(duì)文件進(jìn)行MD5計(jì)算,。 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("請(qǐng)輸入文件名,用于計(jì)算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 } 運(yùn)行得到結(jié)果后,,我們可以使用md5sum命令進(jìn)行驗(yàn)證,。 使用SHA1加密 openssl里幾個(gè)函數(shù)講解 1 //SHA1算法是對(duì)MD5算法的升級(jí),計(jì)算結(jié)果為20字節(jié)(160位),,使用方法如下: 2 //打開(kāi)/usr/include/openssl/sha.h這個(gè)文件我們可以看到一些函數(shù) 3 // 初始化 SHA Contex, 成功返回1,失敗返回0 4 int SHA_Init(SHA_CTX *c); 5 // 循環(huán)調(diào)用此函數(shù),可以將不同的數(shù)據(jù)加在一起計(jì)算SHA1,成功返回1,失敗返回0 6 int SHA_Update(SHA_CTX *c, const void *data, size_t len); 7 // 輸出SHA1結(jié)果數(shù)據(jù),成功返回1,失敗返回0 8 int SHA_Final(unsigned char *md, SHA_CTX *c); 9 // SHA_Init,SHA_Update,SHA_Final三個(gè)函數(shù)的組合,直接計(jì)算出SHA1的值 10 unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md); 11 // 內(nèi)部函數(shù),不需要調(diào)用 12 void SHA_Transform(SHA_CTX *c, const unsigned char *data); 13 14 //上面的SHA可以改為SHA1,SHA224,,SHA256,,SHA384,SHA512就可以實(shí)現(xiàn)多種加密了 我們對(duì)上面的程序進(jìn)行修改 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];//注意這里的字符個(gè)數(shù)為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("請(qǐng)輸入文件名,,用于計(jì)算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個(gè)char)*SHA1有160bit(20個(gè)char)*SHA256有256bit(32個(gè)char)*SHA244有244bit(28個(gè)char)*SHA512有512bit(64個(gè)char).所以要注意修改大小哦:-O |
|
來(lái)自: dwlinux_gs > 《md5 and sha1》