OpenSSL - 文件和字符MD5加密实现

OpenSSL安装

1.github下载最新的OpenSSL:https://github.com/openssl/openssl

2.在linux解压压缩包

3.安装OpenSSL

1 ./config  --prefix=/usr/local --openssldir=/usr/local/ssl
2 make && make install
3 ./config shared --prefix=/usr/local --openssldir=/usr/local/ssl
4 make clean
5 make && make install

4.用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下面

1 ln -s /where/you/install/lib/*.so /usr/lib
2 sudo ldconfig

openssl MD5接口

 1 int MD5_Init(MD5_CTX *c);
 2 //初始化MD5上下文结构
 3 
 4 int MD5_Update(MD5_CTX *c, const void *data, size_t len);
 5 //刷新MD5,将文件连续数据分片放入进行MD5刷新。
 6 
 7 int MD5_Final(unsigned char *md, MD5_CTX *c);
 8 //产生最终的MD5数据
 9 
10 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
11 //直接产生字符串的MD5

代码实现

 1 #include <iostream>
 2 #include <fstream> 
 3 #include <iomanip>
 4 #include <string>
 5 #include <openssl/md5.h>
 6 
 7 using namespace std;
 8 
 9 #define MAXDATABUFF 1024
10 #define MD5LENTH 16
11 
12 int main(int arc,char *arv[])
13 {
14     string strFilePath = arv[1];
15     ifstream ifile(strFilePath.c_str(),ios::in|ios::binary);    //打开文件
16     unsigned char MD5result[MD5LENTH];
17     do
18     {
19         if (ifile.fail())   //打开失败不做文件MD5
20         {
21             cout<<"open file failure!so only display string MD5!"<<endl;
22             break;    
23         }    
24         MD5_CTX md5_ctx;    
25         MD5_Init(&md5_ctx);
26     
27         char DataBuff[MAXDATABUFF];
28         while(!ifile.eof())
29         {
30             ifile.read(DataBuff,MAXDATABUFF);   //读文件
31             int length = ifile.gcount();
32             if(length)
33             {
34                 MD5_Update(&md5_ctx,DataBuff,length);   //将当前文件块加入并更新MD5
35             }
36         }
37         MD5_Final(MD5result,&md5_ctx);  //获取MD5
38         cout<<"file MD5:"<<endl;
39         for(int i = 0; i < MD5LENTH; i++)  //将MD5以16进制输出
40             cout<< hex <<(int)MD5result[i];
41         cout<<endl;
42     }while(false); 
43     
44     MD5((const unsigned char*)strFilePath.c_str(),strFilePath.size(),MD5result);    //获取字符串MD5
45     cout<<"string MD5:"<<endl;
46     for(int i = 0; i < MD5LENTH; i++)
47         cout << hex << (int)MD5result[i];
48     cout<<endl;
49     return 0;
50 }

SConstruct

Program('md5','md5.cpp',LIBS = ['ssl','crypto'])

测试结果与命令行比较

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏葡萄城控件技术团队

Web API 持续集成:PostMan+Newman+Jenkins(图文讲解)

上篇文章我们已经完成了API测试工具选型,接下来是一系列周期性的开发测试过程:接口开发、检出代码、运行测试、记录结果、发送报告。为了快速发现问题,并减少重复过程...

1762
来自专栏后端云

热迁移失败总结

被热迁移的vm内存读写速度超过了内存同步的速度,让热迁移一直没办法完成内存在源节点和目的节点的同步。

3804
来自专栏Spring相关

Spring Boot 日志配置

默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了...

1606
来自专栏jeremy的技术点滴

netty3与netty4的区别

1.2K4
来自专栏乐百川的学习频道

做一个自动配置JDK环境变量的Powershell脚本

本来想把这篇的内容包括在我的Powershell系列文章之内的,后来写完之后才想起来,这时候我已经复制粘贴到简书、CSDN和SegmentFault三个地方了。...

2555
来自专栏开源优测

[接口测试 - 基础篇] 12 还是要掌握python日志管理模块的

python logging模块介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用。这个模块提供不同的...

3678
来自专栏蓝天

Kafka常用命令收录

本文内容主要来自两个方面:一是网上的分享,二是自研的随手记。日记月累,收录kafka各种命令,会持续更新。

6573
来自专栏纯洁的微笑

springboot(十五):springboot+jpa+thymeleaf增删改查示例

这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例。 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一...

4836
来自专栏猿天地

Netty-整合Protobuf高性能数据传输

前言 本篇文章是Netty专题的第四篇,前面三篇文章如下: 高性能NIO框架Netty入门篇 高性能NIO框架Netty-对象传输 高性能NIO框架Netty-...

31411
来自专栏NetCore

AppFuse项目笔记(1)

AppFuse项目笔记(1) 一、Appfuse简介 Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它对如何集成流行的Sprin...

3265

扫码关注云+社区

领取腾讯云代金券