说明:

  数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是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编程之摘要的更多相关文章

  1. Openssl编程--源码分析

    Openssl编程 赵春平 著 Email: forxy@126.com 第一章 基础知识 8 1.1 对称算法 8 1.2 摘要算法 9 1.3 公钥算法 9 1.4 回调函数 11 第二章 ope ...

  2. OpenSSL编程

    简介 OpenSSL是一个功能丰富且自包含的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算.非对称算法密钥生成 ...

  3. 基于openeuler的openssl编程

    ------------恢复内容开始------------ 一.编译环境 我下载好之后默认安装了openssl,若未安装的可输入以下命令: wget https://www.openssl.org/ ...

  4. OPENSSL编程 (secure shell, ssh)

    很好的 OPENSSL编程 教程,名字就叫“OPENSSL编程” 它里面还有很多关于密码学的东西. http://www.pengshuo.me http://www.pengshuo.me/2014 ...

  5. 笔记整理——使用openssl编程

    error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...

  6. OPENSSL编程 第二十章 椭圆曲线

    20.1  ECC介绍 椭圆曲线算法可以看作是定义在特殊集合下数的运算,满足一定的规则.椭圆曲线在如下两个域中定义:Fp域和F2m域. Fp域,素数域,p为素数: F2m域:特征为2的有限域,称之为二 ...

  7. OPENSSL编程入门学习

    相关学习资料 http://bbs.pediy.com/showthread.php?t=92649 https://www.openssl.org https://www.google.com.hk ...

  8. OPENSSL编程起步

    原文链接: http://blog.csdn.net/itmes/article/details/7711076 WINDOWS平台下OPENSSL的编译和安装使用 OPENSSL是开放源代码的,可以 ...

  9. 《openssl编程》:第一章基础知识

    第一章 基础知识 1.1 对称算法 对称算法使用一个密钥.给定一个明文和一个密钥,加密产生密文,其长度和明文大致相同.解密时,使用读密钥与加密密钥相同. 对称算法主要有四种加密模式: (1) 电子密码 ...

随机推荐

  1. GetCharWidth32

    #include <windows.h> #include<stdio.h> // 窗口函数的函数原形 LRESULT CALLBACK MainWndProc(HWND, U ...

  2. 微信H5支付demo

    首先我们必须得在微信公众平台和微信商业平台那边配置好相关配置 1.注册微信服务号,开通微信支付权限绑定微信商业平台(这个具体怎么操作我就不说了) 2.获取应用(公众号)appid.应用(公众号)秘钥. ...

  3. 17.3.15---关于GPIO学习笔记

    STM32的IO口可以由软件配置成为8种模式: 1--输入浮空 2--输入上拉 3--输入下拉 4--模拟输入 5--开漏输出 6--推挽输出 7--推挽复用 8--开漏复用 STM32的每个IO口都 ...

  4. Git与IDEA集成

    软件配置: 系统版本:Windows10 JDK版本:1.8 Git版本:2.19.1 IDEA版本:2016.3 Maven版本:3.5.4 Git安装: Git下载地址:https://git-s ...

  5. 【Java杂货铺】JVM#Java高墙之GC与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 上一章看了高墙的一半,接下 ...

  6. 第一章:基于面向对象的UML

    1.1什么是面向对象 面向对象程序设计(Object-Oriented Programming,OOP)立足于创建软件代码的重复使用,具有更好地模拟现实世界的能力,这使它被公认为是自上而下编程的最佳选 ...

  7. 40)PHP,mysql_fetch_row和mysql_fetch_array和mysql_fetch_assoc的区别

    分析: mysql_fetch_row,这个函数是从结果集中取一行作为枚举数据,从和指定的结果标识关联的结果集中取得一行数据并作为数组返回.每个结果的列储存在一个数组的单元中,偏移量从 开始. 注意, ...

  8. 【UML】

    静态:类图,包图,部署图,构件图,对象图 行为:用例图,活动图,顺序图,状态图,交互图 [类图] http://www.uml.org.cn/oobject/201104212.asp [对象图] h ...

  9. python数据类型:Number数字

    Python Number数据类型用于存储数值 数据类型是不允许改变的,如果改变Number数据类型的值,将从新分配内存空间 整型(int):整型或整数,是正或者负整数,不带小数点 长整型(long) ...

  10. Tomcat远程调试模式及利用Eclipse远程链接调试

    1.启动tomcat到调试模式 进入到tomcat的bin目录下,执行命令./catalina.sh jpda run 启动日记会提示打开调试端口默认为8000 2.调试Eclipse远程连接tomc ...