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

  

  

Linux下C语言使用openssl库进行加密,布布扣,bubuko.com

时间: 2024-08-02 07:01:49

Linux下C语言使用openssl库进行加密的相关文章

linux下C语言编程动态库so的编写及调用

//test_so.h #include <stdio.h> void test_a(); void test_b(); //test_a.c #include "so_test.h" void test_a() { printf("this is in test_a...\n"); } //test_b.c #include "so_test.h" void test_b() { printf("this is in te

indy openssl lazarus 编程linux下出现不能装载动态库的问题原因!

版本不对的原因. 具体在10.5.9下修改此参数即可解决问题. LoadFunction() has an ACritical parameter. It is set to True by default, but can be set to False for individual functions (and currently is False for TLS 1.1+ and DTLS functions). You can patch IdSSLOpenSSLHeaders.pas

LINUX下C语言编程调用其他函数、链接头文件以及库文件

LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时,可以直接在main函数中包含该文件,比如一个文件夹下包含add.c和main.c文件: 方法一: 文件add.c定义两个整数相加的函数,code如下: #include <stdio.h> #include <math.h> int add(int a,int b) { int z;

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window

笔记整理——Linux下C语言正则表达式

Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论阅读评论 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库. C语言处理正则表达式常用的函数有regcomp

Linux下C语言编程基础学习记录

VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s文件转化为*.o的二进制目标代码文件. 链接阶段:将*.o文件转化为可执行文件. 生成可执行文件:将*.o转换为可执行文件. 执行可执行C语言文件. gcc常用选项列表 -c      只编译不链接,生成目标文件“.o” -S      只编译不汇编,生成编码代码 -E      只进行预编译,不做

linux下C语言函数执行时间统计

转载:http://blog.csdn.net/linquidx/article/details/5916701#t5 写好程序,用gcc编译,带上-pg参数,然后运行以后分析gmon.out文件: 命令exp:   gprof ./test-main ./gmon.out >1.log  在1.log中会生成各函数运行情况. gprof 1.1 简介 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口

linux 下C语言学习路线

转载:http://blog.csdn.net/xdw1985829/article/details/6817403 UNIX/Linux下C语言的学习路线. 一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统     在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux