在这里插一小节加密的吧,使用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. Cocos2d-x Touch事件处理机制

    在Cocos2d-x中提供两种触摸事件处理机制:CCStandardTouchDelegate和CCTargetedTouchDelegate. 一.如何使用 0.默认情况下CCLayer都是没有启动 ...

  2. c#实现验证码功能(多种模式下分别实现验证功能)详细,带注释

    网上找了很多验证相关的代码,发现有很多瑕疵.现在本人整理测试了一个实现验证码功能的代码,里面有纯数字,纯英文,英文和数字混合等三种模式.并且在必要地方都已经备有注释,希望可以帮到那些需要的人. 验证码 ...

  3. UILabel字体间距调整

    思路: 写一个 UILbel的子类:在子类里面重新布置UILbel的字体间距: 如代码 .h #import <UIKit/UIKit.h> @interface AdjustableUI ...

  4. 把mysql数据库生成数据字典,直接可用

    便于查看数据库表.字段,做一个数据字典是很有必要的,下面只需要简单更改下配置就可以用了,样式也是挺好的. <?php header('content-type:text/html;charset ...

  5. Java从零开始学二十四(集合工具类Collections)

    一.Collections简介 在集合的应用开发中,集合的若干接口和若干个子类是最最常使用的,但是在JDK中提供了一种集合操作的工具类 —— Collections,可以直接通过此类方便的操作集合 二 ...

  6. Android:子线程向UI主线程发送消息

    在Android里,UI线程是不同意被堵塞的.因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要如何通知UI线程呢? 我们能够在UI主线程中创建一个handler对象,然后通过重写其h ...

  7. 在Ubuntu Server是配置iptables防火墙

    iptables 是一个安装在Ubuntu Server上的默认防火墙.在正常的ubuntu安装过程中,iptables是被安装上了的,但是它默认允许所有的流量(不管防火墙是否是无效的) 关于ipta ...

  8. maven org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 60

      maven org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant poo ...

  9. getpass模块

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #getpass模块 import getpass ''' >>> help(getpass ...

  10. scala中:: , +:, :+, :::, +++的区别

    4种操作符的区别和联系 一. ::   该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表. 用法为 x::list,其中x为加入到 头部的元素,无论x是列表与否,它都只将成为新生成列 ...