OpenSSL - 文件和字符MD5加密实现
时间:2022-05-16
本文章向大家介绍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'])
测试结果与命令行比较:
- 【译】WordPress 中的50个过滤器(6):第41-50个过滤器
- 【译】WordPress 中的50个过滤器(5):第31-40个过滤器
- 使用VS2010 C#开发ActiveX控件
- JavaScript 基础(三) 对象 条件判断
- “大数据+定制化服务”或将引领高端旅游市场
- FrameLayout(框架布局)
- WordPress 中变量$allowedposttags 添加自定义HTML属性
- 移动端UC /QQ 浏览器的部分私有Meta 属性
- RelativeLayout(相对布局)
- TableLayout(表格布局)
- 【MindiaX实例】 PHP 在foreach 中获取JSON 单个数据
- 史上十大最严重黑客袭击事件盘点
- LinearLayout(线性布局)
- 服务化了,没想到耦合更加严重?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Unet实现文档图像去噪、去水印
- 「influxDB 原理与实践(一)」安装部署,实现基础的添加删除查询功能
- 「influxDB 原理与实践(二)」详解influxDB的写入与查询
- Nginx系列:https配置
- 笛卡尔积、等值连接、自然连接、外连接一文看懂
- nginx系列:常用利用shell统计日志
- Nginx系列:图片过滤处理
- Nginx系列:几款负载均衡第三方插件的安装与使用
- 「高并发通信框架Netty4 源码解读(三)」NIO缓冲区Buffer详解
- UML类图符号:各种关系说明以及举例
- 「高并发通信框架Netty4 源码解读(四)」NIO缓冲区之字节缓冲区ByteBuffer详解
- 「influxDB 原理与实践(三)」连续查询
- 为什么使用OPA而不是原生的Pod安全策略?
- 浅入浅出 Java ConcurrentHashMap
- 「高并发通信框架Netty4 源码解读(五)」NIO通道Channel详解