说明:

  数字摘要是将任意长度的消息变成固定长度的短消息,它类似于一个自变量是消息的函数,也就是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. vim中的正则表达式替换

    这个总结的不错 http://tanqisen.github.io/blog/2013/01/13/vim-search-replace-regex/

  2. kotlin 单例模式

    class Single{ companion object { val instance:Single by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZE ...

  3. AtCoder Beginner Contest 126

    因为本人rating太低,这场比赛还要记rating就来划水了,果然垫底了. 6题都很水,于是头一次在网赛中AK,不过由于网卡+手速太慢还是成功垫底. ABE 签到.不贴代码了,因为A考察字符串读入和 ...

  4. DOM(Document Object Model)

    DOM(Document Object Model):    结点的概念:整个文档就是由层次不同的多个节点组成,可以说结点代表了全部内容.    结点类型        1.元素结点 对于元素结点的n ...

  5. 2019-2020-1 20199324《Linux内核原理与分析》第二周作业

    一.知识点总结 1.冯诺依曼体系结构的要点: ①五大基本类型部件:运算器.控制器.存储器.输入设备.输出设备 ②用二进制来表示指令和数据 ③ 核心:存储程序计算机 2.常见的汇编指令 mov指令(l指 ...

  6. 我是如何在四年时间里,从厨师转行为 Serverless 应用开发者

    ▎本文系译文,我的软件开发入行经历非常有趣 -- 我一开始其实是厨师. 作者:KieranMcCarthy 译者:Aceyclee 我在高中时就喜欢烹饪和烘焙,用不同食材的搭配去做出美味的食物,就像个 ...

  7. 系统学习Javaweb8----JavaScript4(结束)

    学习内容: 1.DOM对象 1.2DOM对象--元素对象常见属性 2.JS事件 2.1JS事件--入门案例 2.2JS事件--驱动机制 2.3常见JS事件--点击事件 2.4常见JS事件--点击事件 ...

  8. 第一届“信安杯”部分WriteUp

    第一届"信安杯"部分WriteUp------OooooohLeeGay队! 小队成员(按姓氏):郭泽坤.李江川.赵乐祺 以下这部分是做出来的 2019.11.23-24 ++Re ...

  9. [LC] 40. Combination Sum II

    Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...

  10. Qt platform plugin 'windows' 问题的解决方法

    关于Qt 发布程序时遇到qt platform plugin ‘windows’问题的解决方法如下  遇到这个问题,一般应该已经把一部分dll拷贝到了发布的可执行文件同级目录, 我是直接添加C:\Qt ...