OpenSSL编程之摘要
说明:
数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是Hash函数。数字摘要就是采用单向Hash函数将需要加密的明文“摘要”成一串固定长度(128位)的密文这一串密文又称为数字指纹,它有固定的长度,而且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。常用的摘要函数有:MD5、SHA1、SHA256等。
以下内容是采用OpenSSL中提供的摘要算法对文件内容进行摘要计算,这些方法同样适用于字符串。
md.h
#ifndef _MD_H_
#define _MD_H_ #include <stdio.h>
#include <string.h> #include <openssl/md5.h>
#include <openssl/sha.h> void calc_fileMD5(const char *filename,unsigned char *dgst);
void calc_fileSHA(const char *filename,unsigned char *dgst);
void calc_fileSHA224(const char *filename,unsigned char *dgst);
void calc_fileSHA256(const char *filename,unsigned char *dgst);
void calc_fileSHA384(const char *filename,unsigned char *dgst);
void calc_fileSHA512(const char *filename,unsigned char *dgst); void printDgst(unsigned char* dgst,size_t len); #endif
md.c
#include "md.h" void calc_fileMD5(const char *filename, unsigned char *dgst)
{
MD5_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} MD5_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
MD5_Update(&ctx, buf, len);
memset(buf, , len);
}
MD5_Final(dgst, &ctx);
}
void calc_fileSHA(const char *filename, unsigned char *dgst)
{
SHA_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} SHA1_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
SHA1_Update(&ctx, buf, len);
memset(buf, , len);
}
SHA1_Final(dgst, &ctx);
}
void calc_fileSHA224(const char *filename, unsigned char *dgst)
{
SHA256_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} SHA224_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
SHA224_Update(&ctx, buf, len);
memset(buf, , len);
}
SHA224_Final(dgst, &ctx);
}
void calc_fileSHA256(const char *filename, unsigned char *dgst)
{
SHA256_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} SHA256_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
SHA256_Update(&ctx, buf, len);
memset(buf, , len);
}
SHA256_Final(dgst, &ctx);
}
void calc_fileSHA384(const char *filename, unsigned char *dgst)
{
SHA512_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} SHA384_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
SHA384_Update(&ctx, buf, len);
memset(buf, , len);
}
SHA384_Final(dgst, &ctx);
}
void calc_fileSHA512(const char *filename, unsigned char *dgst)
{
SHA512_CTX ctx;
char buf[] = {};
int len = ; if (NULL == filename || NULL == dgst)
{
printf("Input error...\n");
return;
} FILE *fp = fopen(filename, "rb");
if (NULL == fp)
{
printf("open file:%s error...\n", filename);
return;
} SHA512_Init(&ctx);
while ((len = fread(buf, , , fp)) > )
{
SHA512_Update(&ctx, buf, len);
memset(buf, , len);
}
SHA512_Final(dgst, &ctx);
} void printDgst(unsigned char *dgst, size_t len)
{
if (NULL == dgst || len <= )
{
printf("Input error...\n");
return;
} for (size_t i = ; i < len; ++i)
printf("%x", dgst[i]);
printf("\n");
}
OpenSSL编程之摘要的更多相关文章
- Openssl编程--源码分析
Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...
- OpenSSL编程
简介 OpenSSL是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成 ...
- 基于openeuler的openssl编程
------------恢复内容开始------------ 一.编译环境 我下载好之后默认安装了openssl,若未安装的可输入以下命令: wget https://www.openssl.org/ ...
- OPENSSL编程 (secure shell, ssh)
很好的 OPENSSL编程 教程,名字就叫“OPENSSL编程” 它里面还有很多关于密码学的东西. http://www.pengshuo.me http://www.pengshuo.me/2014 ...
- 笔记整理——使用openssl编程
error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...
- OPENSSL编程 第二十章 椭圆曲线
20.1 ECC介绍 椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则.椭圆曲线在如下两个域中定义:Fp域和F2m域. Fp域,素数域,p为素数: F2m域:特征为2的有限域,称之为二 ...
- OPENSSL编程入门学习
相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...
- OPENSSL编程起步
原文链接: http://blog.csdn.net/itmes/article/details/7711076 WINDOWS平台下OPENSSL的编译和安装使用 OPENSSL是开放源代码的,可以 ...
- 《openssl编程》:第一章基础知识
第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...
随机推荐
- 常用STL的常见用法
//#pragma comment(linker, "/STACK:1024000000,1024000000") //#pragma GCC optimize(2) //#inc ...
- matlab设置mex失败
更新 使用matlab2017b时,又报错, >> mex -setup 警告: Xcode is installed, but its license has not been acce ...
- Spring4.3.25版本使用的积累性总结(不定期更新)
Spring4.3.25版本使用的积累性总结 Spring4.x所有Maven依赖 Spring基于XML配置方式注入bean对象和@Resource注解的使用 详解Spring3.x 升级至 Spr ...
- rsync配置文件模板
用脚本实现服务端rsyncd的部署cat /server/scripts/rsync_install.sh #!/bin/bash #安装包 yum install -y rsync &> ...
- 字典|字典和数组嵌套|keys()|value()|item()|del
python 中没有i++! dic = { 'a':5, 'kelv':'ooo', 5:2333, 2333:'yoo' } print dic[dic[dic['a']]] print dic ...
- VB6的安装过程视频讲解
开发Windows桌面应用程序.开发Office的COM加载项,都离不开VB.本视频从VB安装包的下载和解压缩,一直讲到安装结束后创建项目为止.截图如下: 视频地址: https://pan.baid ...
- 使用java获取手机号归属地等信息httpClient实现
java获取手机号归属地 一般想获取手机号归属地等信息个人是无法获取的,但是可以通过调用第三方接口获取,具体百度搜索很多这里例子提供一个淘宝的接口 ,该功能已经发布到网站作为一个在线小工具,拿走不谢: ...
- 吴裕雄--天生自然python机器学习:Logistic回归
假设现在有一些数据点,我们用 一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类 ...
- 邪恶的csrf
关于csrf是啥我就不多说了 进入正文 场景模拟 场景一 在一个bbs社区里,用户在发言的时候会发出一个这样的GET请求: #!html GET /talk.php?msg=hello HTTP/1. ...
- Django学习之路由层
Django请求生命周期 - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask.Django) - 中间件,帮助我们对请求进行校验或在请 ...