C++ 开源密码库之OpenSSL的使用

系列文章目录

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库编译比较麻烦,建议直接下载我已经编译好的库,进行使用,方便简单。

  • 8
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值