单片机c语言 openssl,Linux下C语言使用openssl库进行加密
在這里插一小節(jié)加密的吧,使用openssl庫進行加密。
使用MD5加密
我們以一個字符串為例,新建一個文件filename.txt,在文件內(nèi)寫入hello ,然后在Linux下可以使用命令md5sum filename.txt計算md5值 ==>?b1946ac92492d2347c6235b4d2611184 ?。雖然寫入的是hello這5個字符,但是我們使用命令xxd filename.txt后可以看出文件結(jié)尾處會有個0x0a這個回車符。所以在下面的代碼中才會有\(zhòng)n。
1 //打開/usr/include/openssl/md5.h這個文件我們可以看到一些函數(shù)2 //初始化 MD5 Contex, 成功返回1,失敗返回0
3 int MD5_Init(MD5_CTX *c);
4 //循環(huán)調(diào)用此函數(shù),可以將不同的數(shù)據(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三個函數(shù)的組合,直接計算出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);
新建一個cpp文件用于計算MD5值
1 #include
2 #include
3 #include
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
17 {
18 printf("%02X",outmd[i]);
19 }
20 printf("\n");
21 return 0;
22 }
編譯選項為: g++ MD5test.cpp -lssl -o MD5test
運行后的結(jié)果為:?B1946AC92492D2347C6235B4D2611184
注意這里用到openssl庫,可以運行 yum install openssl ?和 yum install openssl-devel 進行安裝。
下面這個代碼是對文件進行MD5計算。
1 #include
2 #include
3 #include
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
35 {
36 printf("%02X",outmd[i]);
37 }
38 printf("\n");
39 return 0;
40 }
運行得到結(jié)果后,我們可以使用md5sum命令進行驗證。
使用SHA1加密
openssl里幾個函數(shù)講解
1 //SHA1算法是對MD5算法的升級,計算結(jié)果為20字節(jié)(160位),使用方法如下:2 //打開/usr/include/openssl/sha.h這個文件我們可以看到一些函數(shù)3 //初始化 SHA Contex, 成功返回1,失敗返回0
4 int SHA_Init(SHA_CTX *c);
5 //循環(huán)調(diào)用此函數(shù),可以將不同的數(shù)據(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三個函數(shù)的組合,直接計算出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就可以實現(xiàn)多種加密了
我們對上面的程序進行修改
1 #include
2 #include
3 #include
4
5 int main()
6 {
7 SHA_CTX stx;
8 unsigned char outmd[20];//注意這里的字符個數(shù)為209 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
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
總結(jié)
以上是生活随笔為你收集整理的单片机c语言 openssl,Linux下C语言使用openssl库进行加密的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 借呗逾期了征信如何恢复 及时还款最重要
- 下一篇: 恒通银行属于什么银行