Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)

news/2024/4/28 10:50:51/文章来源:https://blog.csdn.net/u012175089/article/details/130387460

参考文章https://blog.csdn.net/xray2/article/details/120497146

之所以多次一举自己写多一篇文章,主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。

1.首先确认一下自己的代码是Win32的还是Win64的,我操作系统是64的,忘记程序不知道什么时候改为32的了,后来又重新搞了一遍。

2.openssl官方貌似不提供线程的dll和lib文件,可能是处于安全吧,反正不深究了。真的安装好像也没花什么时间

3.下载源码

官网下载地址

选择合适自己的版本,注意的是3.x和1.x版本相差巨大的。由于我们用的外网正式服已经装了1.x的版本,所以我下载的是1.1.1t版本。不过安装流程应该没区别的。

4. 安装Perl

官网地址: Strawberry Perl for Windows

 我也不知道这个东西具体起到什么作用,不过大佬们都用这个,照抄就好了。另外官网也有64和32两种版本。由于我要生成的是32版本的openssl,所以下载了32版本,不过我觉得应该不影响的。

看看环境变量有没有,没有的加一下咯。 

测试一下是否安装成功,用cmd执行一下 perl -v

5.安装NASM

官网地址:  https://www.nasm.us/

我点了win32的

 安装完之后,顺手配一下NASM

6.打开控制台 

根据需要编译的平台选择相应的控制台,64位的选择x64,32位的选择x86

 

 我选的是x86这个,64的可以选x64那个。令我费解的是既然这个是不是也不影响生成的版本的呢,因为下面的命令行是要填生成的是64还是32的。

第一步下载的openssl解压一下,放到E盘,这里我第一次操作的时候,是进入E盘,就输入命令行的。结果生成了一大堆东西在E盘,而且好像东西都乱了。所以搞了第二次的时候,我直接创建了一个叫xxx的文件夹,把解压的内容放到xxx里面。

例如:cd xxx/openssl

 另外创建了个common目录在xxx目录下。

我不知道哪一步出错会导致生成的东西全乱了。反正现在的目录结构等下是没有用的。所以建议按我这样写好了。

命令行需要进入的是openssl的目录

执行:

 perl Configure VC-WIN32 no-asm --debug --prefix=E:\xxx\common\openSSL --openssldir=E:\xxx\common\ssl

 具体参数在openssl解压的目录下有个 INSTALL 文件可以查看

32位:VC-WIN32

64位:VC-WIN64A

不使用汇编代码:no-asm

Debug:--debug

Release:--release(默认)

最后安装的目录:--prefix=E:\Common\OpenSSL

一些配置说明文件存放目录:--openssldir=E:\Common\SSL

 这里不深究了,借别人的图用一下

然后执行:

nmake

 要等几分钟,没什么特别明显的信息,就不截图了。

跟着继续,有些文章说这一步可以跳过

nmake test

这一步确实又多了几分钟

最后是生成,我也不知道上面是干嘛了

nmake install

lib文件在lib目录下,在编译和链接的时候会用到,由于我的目录年代久远,不惧参考意义,所以写怎么引入到工程了

dll文件在bin目录下,在启动运行的时候会用到。这个放在程序启动的那个目录就行了。

 引入的头文件

 大概这样引入到工程

 最后,来个测试咯。

头文件

#ifndef _GateApp_Test_SSLTestManager_H_
#define _GateApp_Test_SSLTestManager_H_
#include "Common/EngineHeader.h"namespace GateApp
{class CSSLTestManager{private:CSSLTestManager() {};~CSSLTestManager() {};public:static CSSLTestManager* instance();public:string getMD5(const string& str);string getMAC();void test2();void runTestSSL();};
}#endif // _GateApp_Test_SSLTestManager_H_

 cpp文件

#include "Test/SSLTestManager.h" 
#include <iostream>
#include "openssl/evp.h"#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")GateApp::CSSLTestManager* GateApp::CSSLTestManager::instance()
{static CSSLTestManager _instance;return &_instance;
}string GateApp::CSSLTestManager::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;
}string GateApp::CSSLTestManager::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;
}void GateApp::CSSLTestManager::test2()
{const char* src = "Test OpenSSL MD5!";unsigned char dst[0x10] = { 0 };unsigned int dst_len = 0x10;size_t src_len = strlen(src);EVP_MD_CTX* ctx;ctx = EVP_MD_CTX_new();EVP_MD_CTX_init(ctx);EVP_DigestInit(ctx, EVP_md5());if (EVP_DigestUpdate(ctx, src, src_len)){if (EVP_DigestFinal(ctx, dst, &dst_len)){EVP_MD_CTX_free(ctx);}}}void GateApp::CSSLTestManager::runTestSSL()
{ cout << "MAC地址加密:" << getMD5(getMAC()) << endl;test2();system("pause");
}

找个main函数调一下


int main(int argc, char* argv[])
{GateApp::CSSLTestManager::instance()->runTestSSL();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_104062.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SVN】windows SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

材料写作素材:关于“大”排比句40例

1.一轮思想政治“大督查”&#xff0c;一轮政策落实“大检查”&#xff0c;一次非公企业“大走访”&#xff0c;一次问题线索“大起底”&#xff0c;一批典型案例“大曝光”。 2.在重大风险挑战面前豁得出去、顶得上去&#xff0c;在重大困难考验面前迎难而上、敢于胜利&#…

逐浪智能时代,网易数帆“重写”低代码

如今&#xff0c;越来越多行业正驶入数字化转型的深水区&#xff0c;如何彻底释放数据生产力&#xff0c;成为所有企业的一道必答题。 4月25日&#xff0c;“网易数帆低代码业务战略发布会”在线上举行。在发布会上&#xff0c;网易数帆发布了CodeWave智能开发平台&#xff0c…

e签宝,「进化」在2023

精准布局生态化、统一化、智能化、信创化&#xff0c;辅以具体产品落地&#xff1b;加速产业、行业、企业、业务&#xff0c;“四业”互通互联&#xff0c;提高产业数字化渗透率。电子签“群战”时代&#xff0c;e签宝再次进化。 作者|斗斗 出品|产业家 “印章在谁手上&…

h5逻辑_解决h5页面嵌入ios兼容性问题

安全区域 如下图所示&#xff5e; 蓝色部分为安全区域。处于安全区域内的内容不受圆角、齐刘海、小黑条的影响。 若是将h5页面嵌入app中&#xff0c;就需要进行适配—> 让h5页面展示在安全区域内。 tips: 安全区域是在ios11之后并且是iPhoneX及以上机型才有的。 因此我们只…

Authing 正式发布应用集成网关 - Authing Gateway

2023 年 2月&#xff0c; Authing 推出了身份领域的 PaaS化应用集成网关 - Authing Gateway 。 Authing Gateway 提供将原有应用快速集成到 Authing 身份云产品的能力&#xff0c;在扩充身份认证方式的同时&#xff0c;提高资源的安全性和数据的隐私可靠性。 01.Authing Gatew…

基于信度感知的半监督医学图像分类对比自集成

文章目录 Reliability-Aware Contrastive Self-ensembling for Semi-supervised Medical Image Classification摘要本文方法Reliability-Aware Contrastive Mean TeacherWeight FunctionReliability-Aware Consistency LossReliability-Aware Contrastive LossObjective Functi…

NUMA详解

目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数&#xff1a; 查看每个NUMA节点的CPU使用情况&#xff1a; 看每个NUMA节点的内存使用情况&#xff1a; 查看NUMA下指定进程的运行情况 创建…

基于Dokcer安装RabbitMQ

基于Dokcer安装RabbitMQ 一、RabbitMQ介绍 1.1 现存问题 服务调用&#xff1a;两个服务调用时&#xff0c;我们可以通过传统的HTTP方式&#xff0c;让服务A直接去调用服务B的接口&#xff0c;但是这种方式是同步的方式&#xff0c;虽然可以采用SpringBoot提供的Async注解实现…

2023.4.17-4.23 AI行业周刊(第146期):创业要趁早

最近有很多外部拓展培训的需求&#xff0c;联盟的共学课程培训&#xff0c;公司视觉软件的培训&#xff0c;行业课程的培训&#xff0c;每一项培训听起来简单&#xff0c;但是其实都需要大量的时间精力。 前两年也准备过一份《30天入门人工智能》的视频课程&#xff0c;总共31…

【翻译一下官方文档】邂逅uniCloud云函数(基础篇)

我将用图文的形式&#xff0c;把市面上优质的课程加以自己的理解&#xff0c;详细的把&#xff1a;创建一个uniCloud的应用&#xff0c;其中的每一步记录出来&#xff0c;方便大家写项目中&#xff0c;做到哪一步不会了&#xff0c;可以轻松翻看文章进行查阅。&#xff08;此文…

太为难我了,阿里面试了7轮...

前言 今年的大环境非常差&#xff0c;互联网企业裁员的现象比往年更严重了&#xff0c;可今年刚好是我的第一个“五年计划”截止的时间点&#xff0c;说什么也不能够耽搁了&#xff0c;所以早早准备的跳槽也在疫情好转之后开始进行了。但是&#xff0c;不得不说&#xff0c;这…

ZmosHarmony buildroot移植与使用

前言 移植过程 1、添加编译选项编译buildroot。 2、开机启动时设置 LD库的环境变量与PATH路径。 是什么原因需要这样操作&#xff1f; 主要使用busybox&#xff0c;使用buildroot的瑞士军dao。 使用busybox 为buildroot下的使用 第一次启动时设置 由于是在vendor分区因此 …

C++题解 | 逆波兰表达式相关

✨个人主页&#xff1a; 夜 默 &#x1f389;所属专栏&#xff1a; C/C相关题解 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言…

java获取类结构信息

package com.hspedu.reflection;import org.junit.jupiter.api.Test;import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** author 韩顺平* version 1.0* 演示如何通过反射获…

ROC的理解

ROC 的由来 ROC 曲线是由混淆矩阵衍生来的指标。 混淆矩阵如图所示&#xff0c; 二ROC曲线的横坐标为 FPR&#xff0c;纵坐标为 TPR&#xff0c;计算公式分别是 F P R F P F P T N , 也就是 F P R F P F A L S E FPR \frac{FP}{FPTN}, 也就是 FPR \frac{FP}{FALSE} FP…

一条命令搭建HTTP服务器

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

TCP流量控制与拥塞控制

什么是流量控制 一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段&#xff0c;就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。 如果发送者发送数据过快、过多&#xff0c;而接收方的应用程序从缓冲区读取的速度较慢&…

面试题30天打卡-day13

1、Linux 中的硬链接和软连接是什么&#xff0c;二者有什么区别&#xff1f; 在Linux系统下&#xff0c;有两种链接文件&#xff0c;一种是硬链接&#xff08;Hard Link&#xff09;&#xff0c;一种是软链接&#xff0c;也称为符号链接&#xff08;Symbolic Link&#xff09;…

Codeforces Round 867 (Div. 3)

Problem - E - Codeforces 思路&#xff1a; 首先&#xff0c;如果n为奇数&#xff0c;中间那个数无法调整&#xff0c;所以只考虑偶数只有26个字母&#xff0c;我们用cnt[]记录每个字母需要交换的对数。设maxn为交换对数最多的字母。显然&#xff0c;如果cnt[maxn]>n/2,显…