当前位置: 首页 > news >正文

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

参考文章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;
}

相关文章:

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

参考文章https://blog.csdn.net/xray2/article/details/120497146 之所以多次一举自己写多一篇文章&#xff0c;主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 1.首先确认一下自己的代码是Win32的还是Win64的&#xff0c;我操作系统是64的&#xff0c;忘…...

TensorFlow高阶API和低阶API

TensorFlow提供了众多的API&#xff0c;简单地可以分类为高阶API和低阶API. API太多太乱也是TensorFlow被诟病的重点之一&#xff0c;可能因为Google的工程师太多了&#xff0c;社区太活跃了~当然后来Google也意识到这个问题&#xff0c;在TensorFlow 2.0中有了很大的改善。本文…...

强训之【参数解析和跳石板】

目录 1.参数解析1.1题目描述1.2思路1.3代码 2.跳石板2.1题目2.2思路2.3代码 3.选择题 1.参数解析 1.1题目描述 在命令行输入如下命令&#xff1a; xcopy /s c:\ d:\e&#xff0c; 各个参数如下&#xff1a; 参数1&#xff1a;命令字xcopy 参数2&#xff1a;字符串/s 参数…...

Redis队列Stream、Redis多线程详解(三)

Redis中的线程和IO模型 什么是Reactor模式 &#xff1f; “反应”器名字中”反应“的由来&#xff1a; “反应”即“倒置”&#xff0c;“控制逆转”,具体事件处理程序不调用反应器&#xff0c;而向反应器注册一个事件处理器&#xff0c;表示自己对某些事件感兴趣&#xff0…...

MySQL统计函数count详解

count()概述 count() 是一个聚合函数&#xff0c;返回指定匹配条件的行数。开发中常用来统计表中数据&#xff0c;全部数据&#xff0c;不为null数据&#xff0c;或者去重数据 count(1)和count()和count(列名)的区别 1.函数说明 count(1)&#xff1a;统计所有的记录&#xff0…...

实验04:图像压缩(DP算法)

1.实验目的&#xff1a; 掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具&#xff0c;运用动态规划的思想来求解图像压缩问题。 2.实验内容&#xff1a; 给定一幅图像&#xff0c;求解最佳压缩&#xff0c;使得压缩后的文件最小。 3.实验要求…...

4.19--面试系列之真题版本--redis出现大key怎么解决?Redis 大 Key 对持久化有什么影响?

对于redis出现大key的情况&#xff0c;可以通过以下几种方式来解决&#xff1a; 1.分布式存储&#xff1a;将大key拆分成多个小的key&#xff0c;分别存储在不同的节点上。 2.数据过期&#xff1a;对于大key中不经常使用的数据&#xff0c;可以使用redis自带的过期特性&#xf…...

新手在家做自媒体要如何起步?

不少人都想做自媒体来增加自己的收入或者创业&#xff0c;但没有人带领&#xff0c;自己像是无头苍蝇一样&#xff0c;不知道往哪里走。 今天这期内容大周就来给粉丝们分享一点干货&#xff0c;如果对你有所帮助&#xff0c;记得点赞支持一下大周。 1、注册账号 如果你连一个…...

易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此&#xff0c;更好理解农业生态中种植和未种植群落中的病毒分布&#xff0c;以及它们之间的病…...

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题&#xff0c;两个样例都可以通过&#xff0c;但是提交之后最终的通过率只有8.51%&#xff1f;&#xff1f;&#xff1f;自己搞了半天一直都是这个通过率&#xff0c;然后用网上说的100%通过率的代码也是一样的结果&#xff0c;最后时间到了还是没有拿到满分&am…...

【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解

引言 Vue 3 的虚拟 DOM 是一种用于优化 Vue 应用程序性能的技术。它通过将组件实例转换为虚拟 DOM&#xff0c;并在组件更新时递归地更新虚拟 DOM&#xff0c;以达到高效的渲染性能。在 Vue 3 中&#xff0c;虚拟 DOM 树由 VNode 组成&#xff0c;VNode 是虚拟 DOM 的基本单元…...

Arduino ESP8266通过udp获取时间以及同步本地时间方法

Arduino ESP8266通过udp获取时间以及同步本地时间 ✨通过udp获取NTP服务器上的时间戳,然后经过转换,得到当前具体的时间。转换相对复杂,对于获取时间还是相对比较准确。📝通过udp获取时间实现代码 #include <ESP8266WiFi.h> #include <WiFiUdp.h>//填写 WiFi…...

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

c/c&#xff1a;char*定义常量字符串&#xff0c;strcmp()函数&#xff0c;strcpy()函数&#xff0c;寻找指定字符&#xff0c;字符串去空格 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所…...

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日&#xff0c;据DAMA中国官方信息&#xff0c;目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中&#xff0c;打算6月考试的朋友们可以抓紧时间报名啦…...

UDS的0x19服务介绍

什么是 UDS&#xff1f; UEI (Unified Diagnostic Services&#xff0c;统一诊断服务) 是一种在车辆电子控制单元 (ECU) 之间交换诊断信息的标准通信协议&#xff0c;它是OBD-II的某些扩展。利用 UDS 协议&#xff0c;诊断工程师可以访问车辆的各种功能&#xff0c;如读取故障…...

QinQ技术与Portal技术

QinQ 802.1Q-in-802.1Q&#xff0c;是一种扩展VLAN标签技术。在城域网中&#xff0c;需要大量的VLAN来隔离区分不同的用户&#xff0c;但是原有的802.1Q只有12个比特&#xff0c;仅能标识4096个VLANQinQ即在802.1Q的基础上&#xff0c;再增加一层外层标签。使得可以标识4096*40…...

Vue-自定义表单验证(rule,value,callback)详细使用

前言 最近在实际开发中遇到需要验证合同编号是否在数据库已经存在&#xff0c;自定义表单验证。 的表单验证大家都知道form绑定rules&#xff0c;prop绑定值与form.值一样&#xff0c;必填&#xff0c;失去焦点触发 提示信息。 今天我们讲一讲自定义验证规则具体使用场景和它…...

港联证券|TMT板块全线退潮,这些个股获主力逆市抢筹

计算机、电子、传媒、通讯职业流出规模居前。 今天沪深两市主力资金净流出709.92亿元&#xff0c;其中创业板净流出218.36亿元&#xff0c;沪深300成份股净流出187.92亿元。 资金流向上&#xff0c;今天申万一级职业普跌&#xff0c;除了国防军工职业小幅上涨&#xff0c;获主…...

WPF学习

一、了解WPF的框架结构 &#xff08;第一小节随便看下就可以&#xff0c;简单练习就行&#xff09; 1、新建WPF项目 xmlns&#xff1a;XML的命名空间 Margin外边距&#xff1a;左上右下 HorizontalAlignment&#xff1a;水平位置 VerticalAlignment&#xff1a;垂直位置 2…...

C#使用WebDriver模拟浏览器操作WEB页面

有时候需要模拟访问页面触发某个功能&#xff0c;可以使用WebDriver来实现这一功能&#xff0c;驱动打开浏览器&#xff0c;并对页面重定向以及对页面写入脚本等操作。 安装Selenium.Chrome&#xff0c;Selenium.Support.UI&#xff0c;Selenium 引入 using OpenQA.Selenium.…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...