C++ 开源密码库之OpenSSL的使用
系列文章目录
C++ 开源密码库之OpenSSL的使用
文章目录
- 系列文章目录
- 前言
- 一、openssl下载
- 二、编译步骤
- 1. 官网步骤
- 2. 实战步骤
- 三、 使用
- 1.引入库
- 2.代码实例
- 3. 结果
- 总结
前言
随着人们信息安全和软件产权的不断发展,加密技术也越来越重要,openssl作为一个功能丰富且开源的加密库,在应用开发中得到广泛的应用, 本文就openssl库下载、编译及C++项目使用进行记录和学习。
一、openssl下载
官网:https://www.openssl.org/
官网下载来的,需要自己手动编译,才能使用。
也可以根据需要下载已经编译好的win32(debug版)和win64版(release版)的软件库,直接使用,无需编译。下载链接如下:
x64版(relese):
链接:https://pan.baidu.com/s/1vM3-BWP8Yi6N5np16B8tHg
提取码:c43b
win32版(debug):
链接:https://pan.baidu.com/s/1Ho1jfOa5DgIatYRFYDWiXA
提取码:kbm9
二、编译步骤
需要下载nasm、perl、openssl以及vs环境。
1. 官网步骤
官网提供的步骤如下:https://github.com/openssl/openssl/blob/master/NOTES-WINDOWS.md
2. 实战步骤
下面,是以vs2013为例,在windows下编译x64版的openssl库步骤:
# 下载nasm
nasm-2.15.05-win64.zip
# 解压
nasm-2.15.05-win64
# 将解压的文件放入环境变量,在cmd的任意位置可以访问
C:\Soft\nasm-2.15.05-win64\nasm-2.15.05\
# 打开cmd,输入以下命令,没有报错,则说明安装成功
nasm# 下载perl
strawberry-perl-5.32.1.1-64bit.zip
# 解压
strawberry-perl-5.32.1.1-64bit
# 环境变量
C:\Soft\strawberry-perl-5.32.1.1-64bit\perl\bin\
# 打开cmd,输入以下命令,没有报错,则说明安装成功
perl -v# 下载openssl Git Bash here打开Git输入以下命令
git clone https://github.com/openssl/openssl.git# 以命令行打开vs2013下的
VS2013 x64 本机工具命令提示
# 进入openssl目录
cd C:\Soft\openssl
# 在openssl根目录中执行,进行配置
perl Configure VC-WIN64A
# 编译
nmake //比较耗时
# 测试
nmake test //比较耗时
# 安装
nmake install
以上所有环节都成功完成之后,就可以在C盘的ProgramFiles文件夹下看到编译生成的OpenSSL库文件,目录结构如下:
说明:
bin目录下:为用到的dll库;
html目录下:为html格式的说明文档;
inlcude目录下:为用到的头文件;
lib目录下:为后面用到的lib库;
三、 使用
1.引入库
项目结构如下:
其中,
bin、include和lib目录为上文中openssl编译结果的三个文件,直接拷贝过来即可;
json目录为项目所用配置文件的路径;
src目录为项目源代码文件。
在vs2013中进行配置如下:
配置属性-》C/C+±》常规-》附加包含目录栏,写入openssl头文件所在路径:
配置属性-》C/C+±》链接器》附加库目录栏,写入openssl静态库文件(lib)所在路径:
将编译产生的可执行程序,放在bin目录(与openssl依赖的libcrypto-1_1.dll和libssl-1_1.dll库放在一起),即可执行。
2.代码实例
下面抽离出项目中,根据MAC地址生成md5序列,对软件进行加密部分为例,进行代码展示,代码如下:
#include<iostream>
#include <WinSock2.h>
#include "Iphlpapi.h"
#include<string>
#include "openssl/md5.h"using namespace std;
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib,"libcrypto.lib")
#pragma comment(lib,"libssl.lib")/*
输出32位长度
*/
string getMD5(const string & str)
{unsigned char md[16] = { 0 };MD5_CTX md5;MD5_Init(&md5);MD5_Update(&md5, str.c_str(), str.size());MD5_Final(md, &md5);char buf[33] = { 0 };char tmp[3] = { 0 };string st; //结果for (auto i = 0; i < 6; i++){sprintf_s(tmp, "%02x", md[i]); //转为u16进制strcat_s(buf, tmp); //将tmp拼接到buf后}st = buf;//在字符串的第4个位置插入一个字符st.insert(4, "-");//在字符串的第8位置插入一个字符st.insert(8, "-");//删除最后一个字符st.erase(st.end() - 1);return st;
}//获取本机MAC地址
string GetMAC()
{byte mac[8] = { 0 };PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();unsigned long stSize = sizeof(IP_ADAPTER_INFO);int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);if (ERROR_BUFFER_OVERFLOW == nRel){delete pIpAdapterInfo;pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);}if (ERROR_SUCCESS == nRel){while (pIpAdapterInfo){memcpy(mac, pIpAdapterInfo->Address, 8);break;//获取到第一个网卡的MAC }}if (pIpAdapterInfo)delete pIpAdapterInfo;char buf[33] = { 0 };char tmp[4] = { 0 };string MAC;for (DWORD i = 0; i < 6; i++){sprintf_s(tmp, "%02x-", mac[i]); //转为u16进制strcat_s(buf, tmp); //将tmp拼接到buf后}MAC = buf;MAC = MAC.erase(MAC.size() - 1); //去除最后一个“-”return MAC;
}int main()
{cout << "MAC地址加密:" << getMD5(GetMAC()) << endl;system("pause");return 0;
}
3. 结果
总结
openssl库编译比较麻烦,建议直接下载我已经编译好的库,进行使用,方便简单。
C++ 开源密码库之OpenSSL的使用相关推荐
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...
- liboqs-量子安全密码算法开源C库
liboqs是一个用于量子安全密码算法的开源C库. 一,概述 liboqs提供: 量子安全 密钥封装机制(KEM)和数字签名算法的开源实现的集合: 这些算法的通用API: 测试工具和基准测试例程. l ...
- 如何通过 Docker 快速部署开源密码管理器 Bitwarden
公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 前言 两年前,我就想自托管 Bitwarden 密码管理器了,但是直到 2022 年快结束的现在,我才真正动手.在 ...
- Linux下常用的C/C++开源Socket库
1. Linux Socket Programming In C++ : http://tldp.org/LDP/LG/issue74/tougher.html 2. ACE: h ...
- 一款超好用的开源密码管理器?
程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容,包括开源项目.资源工具.技术文章等方面. 每周 ...
- 常用开源服务器库和中间件
常用开源服务器库: •asio.•libevent..libev.•muduo .gevent .libuv.Java Netty.Chaos - 开源的c++网络事件库.zeromq arioTCP ...
- 开源密码管理器更安全吗?(2)
密码管理器怎样保护我们的密码? 加密原理 密码学历史悠久,常用于古代军事通信. 3000年前姜子牙就发明了阴符,2000年前罗马帝国诞生了广泛使用的凯撒密码.这些都称为古典密码,通常使用替换法或者移位 ...
- vaultwarden密码库 搭建流程
系统工程 - 建设篇 第二章 vaultwarden密码库 搭建流程 系统工程 - 建设篇 系列文章回顾 前言 前置条件 实施步骤 注意事项 浏览器插件下载链接 部署 vaultwarden密码库 宝 ...
- Padloc:一个直观的开源密码管理器
让我们了解一下这个具有令人愉悦的用户界面.跨平台可用的开源密码管理器. 有大量适用于个人和团队的免费的和收费的密码管理器. 然而,当谈到开源方案时,它通常仅限于几个好的方案,如 Seahorse.Ke ...
- 开源密码管理器 KeeWeb
开源密码管理器 KeeWeb 在互联网上有许多不同种类的密码管理器可供选择.作者之前使用的是1Password 6系列,因为7版本之后的不符合个人的使用习惯.后来尝试过LastPass,但感觉还是不如 ...
最新文章
- DPDK 大页内存实现(二十二)
- 图元变形lisp源码_AutoLISP入门6---图元资料的取得与活用技巧(一).pdf
- FFmpeg编译找不到库文件
- asp.net 中textbox如何自动换行
- mount 安卓system只读_Android如何让system分区可读写(MTK安卓6.0)-阿里云开发者社区...
- [转载] 字符串操作截取后面的字符串_对字符串的5个必知的熊猫操作
- 【debug】requests.exceptions.ChunkedEncodingError: (‘Connection broken: IncompleteRead(0 bytes read)‘
- 设计模式之--单例模式
- 五个案例“熄灭”Nginx漏洞隐患
- Windows最常用的几个网络CMD命令总结
- teamtalk实现即时通讯
- vivo安装android wear,vivo谷歌框架下载-vivo谷歌服务框架v4.1.2 安卓版 - 极光下载站...
- html5演讲ppt,制作ppt太麻烦?用上这5款黑科技PPT模板,汇报、演讲瞬间高大上
- 什么是 DNS,有什么作用?为什么需要更换公共DNS服务器?
- 【Nodejs】用http模块写一个简单的web服务器
- BZOJ5442 [Ceoi2018]Global warming
- 【语义网】Jena框架简介及实战
- 基于伽马变换自适应修正的全景首尾融合算法
- 1905 杨辉三角
- 【PIL案例精讲】252行Python代码制作透明背景的电子印章
热门文章
- IAQI的计算工具类,根据空气检测浓度值计算IAQI值和空气质量等级(pm2.5,pm10,so2,no2,co,o3)
- 基于networkx的《人民的名义》人物关系图
- Directive 详解
- Building Maintainable Software-java篇之Separate Concerns in Modules
- 【Linux / 数据库】项目实战:tpshop项目在Linux系统环境搭建
- RTF转换为HTML格式(java)
- 利用wordcloud和jieba制作词云
- 从偏差和方差的角度解释bagging和boosting的原理
- mysql mgr recovering_mysql group replication recovering 怎么调整为 online
- springboot-mybatis集成 使用逆向工程