在这里插一小节加密的吧,使用openssl库进行加密。

  使用MD5加密

  我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符。所以在下面的代码中才会有\n。

 //打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
// 初始化 MD5 Contex, 成功返回1,失败返回0
int MD5_Init(MD5_CTX *c);
// 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
// 输出MD5结果数据,成功返回1,失败返回0
int MD5_Final(unsigned char *md, MD5_CTX *c);
// MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
// 内部函数,不需要调用
void MD5_Transform(MD5_CTX *c, const unsigned char *b);

  新建一个cpp文件用于计算MD5值

 #include <openssl/md5.h>
#include <string.h>
#include <stdio.h> int main()
{
MD5_CTX ctx;
unsigned char outmd[];
int i=; memset(outmd,,sizeof(outmd));
MD5_Init(&ctx);
MD5_Update(&ctx,"hel",);
MD5_Update(&ctx,"lo\n",);
MD5_Final(outmd,&ctx);
for(i=;i<;i<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return ;
}

  编译选项为: g++ MD5test.cpp -lssl -o MD5test

  运行后的结果为: B1946AC92492D2347C6235B4D2611184

  注意这里用到openssl库,可以运行 yum install openssl  和 yum install openssl-devel 进行安装。

  下面这个代码是对文件进行MD5计算。

 #include <openssl/md5.h>
#include <string.h>
#include <stdio.h> int main()
{
MD5_CTX ctx;
unsigned char outmd[];
char buffer[];
char filename[];
int len=;
int i;
FILE * fp=NULL;
memset(outmd,,sizeof(outmd));
memset(filename,,sizeof(filename));
memset(buffer,,sizeof(buffer));
printf("请输入文件名,用于计算MD5值:");
scanf("%s",filename);
fp=fopen(filename,"rb");
if(fp==NULL)
{
printf("Can't open file\n");
return ;
} MD5_Init(&ctx);
while((len=fread(buffer,,,fp))>)
{
MD5_Update(&ctx,buffer,len);
memset(buffer,,sizeof(buffer));
}
MD5_Final(outmd,&ctx); for(i=;i<;i<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return ;
}

  运行得到结果后,我们可以使用md5sum命令进行验证。

  使用SHA1加密

  openssl里几个函数讲解

 //SHA1算法是对MD5算法的升级,计算结果为20字节(160位),使用方法如下:
//打开/usr/include/openssl/sha.h这个文件我们可以看到一些函数
// 初始化 SHA Contex, 成功返回1,失败返回0
int SHA_Init(SHA_CTX *c);
// 循环调用此函数,可以将不同的数据加在一起计算SHA1,成功返回1,失败返回0
int SHA_Update(SHA_CTX *c, const void *data, size_t len);
// 输出SHA1结果数据,成功返回1,失败返回0
int SHA_Final(unsigned char *md, SHA_CTX *c);
// SHA_Init,SHA_Update,SHA_Final三个函数的组合,直接计算出SHA1的值
unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);
// 内部函数,不需要调用
void SHA_Transform(SHA_CTX *c, const unsigned char *data); //上面的SHA可以改为SHA1,SHA224,SHA256,SHA384,SHA512就可以实现多种加密了

  我们对上面的程序进行修改

 #include <openssl/sha.h>
#include <string.h>
#include <stdio.h> int main()
{
SHA_CTX stx;
unsigned char outmd[];//注意这里的字符个数为20
char buffer[];
char filename[];
int len=;
int i;
FILE * fp=NULL;
memset(outmd,,sizeof(outmd));
memset(filename,,sizeof(filename));
memset(buffer,,sizeof(buffer));
printf("请输入文件名,用于计算SHA1值:");
scanf("%s",filename);
fp=fopen(filename,"rb");
if(fp==NULL)
{
printf("Can't open file\n");
return ;
} SHA1_Init(&stx);
while((len=fread(buffer,,,fp))>)
{
SHA1_Update(&stx,buffer,len);
memset(buffer,,sizeof(buffer));
}
SHA1_Final(outmd,&stx); for(i=;i<;i<i++)
{
printf("%02X",outmd[i]);
}
printf("\n");
return ;
}

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

  

  

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

  1. Linux下C语言编程中库的使用

    零.问题 1. 为什么要用到库? 2. 我要用一个库,但是,尼玛命令行上该怎么写呢?或者说库文件如何使用? 3. Linux的库在那些地方? 4. 什么是静态库,什么是动态库,二者有啥区别? 5. 常 ...

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

    LINUX下C语言编程经常需要链接其他函数,而其他函数一般都放在另外.c文件中,或者打包放在一个库文件里面,我需要在main函数中调用这些函数,主要有如下几种方法: 1.当需要调用函数的个数比较少时, ...

  3. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

  4. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  5. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  6. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  7. Unix和Linux下C语言学习指南

    转自:http://www.linuxdiyf.com/viewarticle.php?id=174074 Unix和Linux下C语言学习指南 引言 尽管 C 语言问世已近 30 年,但它的魅力仍未 ...

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

    Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论 ...

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

    VIM的基本使用  LINUX下C语言编程 用gcc命令编译运行C语言文件 预处理阶段:将*.c文件转化为*.i预处理过的C程序. 编译阶段:将*.i文件编译为汇编代码*.s文件. 汇编阶段:将*.s ...

随机推荐

  1. 浅谈JavaScript框架设计

    在这个js框架随处乱跑的时代,你是否考虑过写一个自己的框架?下面的内容也许会有点帮助. 一个框架应该包含哪些内容? 1.语言扩展 大部分现有的框架都提供了这部分内容,语言扩展应当是以ECMAScrip ...

  2. Java从零开始学二十六(包装类)

    一.包装类 包装类是将基本类型封装到一个类中.也就是将基本数据类型包装成一个类类型. java程序设计为每一种基本类型都提供了一个包装类.这些包装类就在java.lang包中.有8个包装类 二.包装类 ...

  3. Modifying a Request or Response

    To make custom changes to web requests and responses, use FiddlerScript to add rules to Fiddler's On ...

  4. java各种框架的比较,分析

    Spring 框架 优点 1.提供了一种管理对象的方法,可以把中间层的对象有效地组织起来 2.采用了分层结构,可以增量引入到项目中. 3.代码测试较容易 4.非侵入性,应用程序对Spring API的 ...

  5. python2.7中minetypes.py的UnicodeDecodeError

    问题: python错误提示: UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not ...

  6. windows 批处理设置环境变量

      windows通过批处理设置环境变量 CreateTime--2017年8月4日11:28:11Author:Marydon 参考链接:https://wenku.baidu.com/view/a ...

  7. HDUOJ----专题训练

    Problem B Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Su ...

  8. POJ--Strange Way to Express Integers

    Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 8370   ...

  9. Foundations of Machine Learning: Rademacher complexity and VC-Dimension(2)

    Foundations of Machine Learning: Rademacher complexity and VC-Dimension(2) (一) 增长函数(Growth function) ...

  10. Lucene的索引不跨平台

    在windows上使用Lucene生成索引文件,将索引文件复制到Linux服务器上,报错"校验错误,可能是硬件问题". 所以,Lucene的跨平台只是代码跨平台,生成的索引不跨平台 ...