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