系列文章目录
C++ 开源密码库之OpenSSL的使用
前言
随着人们信息安全和软件产权的不断发展,加密技术也越来越重要,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库编译比较麻烦,建议直接下载我已经编译好的库,进行使用,方便简单。