Linux下C語言使用openssl庫進行加密


  在這里插一小節加密的吧,使用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值

 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 MD5test

  運行后的結果為: B1946AC92492D2347C6235B4D2611184

  注意這里用到openssl庫,可以運行 yum install openssl  和 yum install openssl-devel 進行安裝。

  下面這個代碼是對文件進行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命令進行驗證。

 

  使用SHA1加密

   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

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM