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) 电子密码 ...
随机推荐
- Mongodb数据库(linux)——基础操作
简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.它是非关系型数据库,但其结构与MySQL又很相似,mysql中的表格,在这里被称为集合,mysql表格内的数据是一 ...
- Travelling Businessmen Problem
Travelling Businessmen Problem 先求出图的两个部分,可能只有一个部分 然后用set模拟,得到不同部分差最小的 #include <bits/stdc++.h> ...
- kaggle——分销商产品未来销售情况预测
分销商产品未来销售情况预测 介绍 前面的几个实验中,都是根据提供的数据特征来构建模型,也就是说,数据集中会含有许多的特征列.本次将会介绍如何去处理另一种常见的数据,即时间序列数据.具体来说就是如何根据 ...
- Codeforces Round #523 (Div. 2) Cdp
题:https://codeforces.com/contest/1061/problem/C 题意:给你一个序列,我们求他们子序列的个数,这个子序列有个限制就是每一个子序列上的值都必须是能整除他的下 ...
- 2019-2020-1 20199324《Linux内核原理与分析》第三周作业
第二章 操作系统是如何工作的 一.知识点总结 1.计算机的三个法宝 存储程序计算机 函数调用堆栈机制.堆栈:是C语言程序运行时必须使用的记录函数调用路径和参数存储的空间. 中断 2.堆栈相关的寄存器和 ...
- SimpleDateFormat 线程安全的解决方案--DateTimeFormatter
SimpleDateFormat并不是线程安全的,因为在SimpleDateFormat中持有一个Calendar类对象在Parse 和Format方法时会调用calendar.setTime(dat ...
- 00 - 准备 Anaconda 环境
Anaconda 环境 官方下载安装包:https://www.anaconda.com/download/ Anaconda Navigtor :用于管理工具包和环境的图形用户界面,后续涉及的众多管 ...
- mysql模糊匹配like及批量替换replace
1.mysql 模糊匹配 like 与 not like 用法 : SELECT * FROM `user` where `nickname` LIKE '%测试%' SELECT * FROM `u ...
- linux系统用户管理(一)
Linux系统用户管理1.用户管理*****2.Linux用户命令****3.用户创建的原理***4.密码管理***5.组命令管理**6.身份切换*****7.sudo提升权限***** 我们现在所使 ...
- 微信公众平台开发2-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...