将整个文件夹添加到qt项目中_OpenSSL源码在Win中的编译,以及如何给软件加密的大致思路...

本文介绍了在Windows环境下编译OpenSSL源码的详细步骤,包括所需工具和配置过程。接着讨论了使用OpenSSL进行软件加密的思路,提到了服务端生成公私钥对和签名,客户端验证签名的实现方法,并提出了在Qt环境中处理公钥的两种解决方案,以确保安全。
摘要由CSDN通过智能技术生成

目录

1. Windows中OpenSSL源码的编译1.1 Ingredients1.2 开始编译采用OpenSSL对软件进行加密服务端上客户端加密效果

1. Windows中OpenSSL源码的编译

不说Linux中的编译

1.1 Ingredients

openssl-3.0源码

perl(提前安装一下)

dmake(编译过程需要,可以用perl的命令下载,但是下不动,自己从网上找一个 dmake.exe下载下来拷贝过去就行)

nasm

VS2017

这几个我都打包好了(除了VS2017,VS2017在之前的推送中放过),放在以下的百度云中:

链接:https://pan.baidu.com/s/1nZQYhR9XoxP8i8zpWimsKA

提取码:Hong

dmake.exe拷贝到perl目录/site/bin中去。
nasm.exe 所在的路径要添加到环境变量Path中

98187e95b0c58d86eb46450b60775fac.png
cdbc15880e7726541ef297fbc9776363.png
1.2 开始编译
  • 安装 perl 记得勾选 添加到路径

  • 把nasm.exe所在路径添加到环境变量中

  • 把 dmake.exe 拷贝到 perl路径/site/bin 中去

    2704b1e949297d378b2014b77bf69d5a.png

  • 打开VS的这个命令行(要右键,以管理员身份运行)

    69f3b279f72f4ff8e3a0000c6eda52ef.png

输入:

cd 你的OpenSSL源码路径
perl Configure VC-WINA --prefix 输出目录

然后

nmake

中间得等一会!

nmake install

等个好一会就好了。

我们需要从源码目录的 ms目录下 把 applink.c 文件拷贝到输出目录的 include 目录中。在写程序的时候要把这个applink.c 包含到使用OpenSSL库函数的Cpp文件中(不要放在头文件中包含,直接在main.cpp中包含进来就行)

编译好后:

78fc4de0384ac7e0a783a9a957dca44f.png

采用OpenSSL对软件进行加密

这部分不分享源码了,源码太太太多了,也不方便整理,简单说说思路吧。

其实,思路还是和上次的那篇推送一样,不过,上次是用Python做的,这回是用C++做。

服务端上
  • 直接采用编译出来的OpenSSL的可执行程序来生成公私密钥对,或者采用OpenSSL的函数来生成也行。密钥对生成一次就够了。

  • 利用私钥,对客户发送过来的计算机硬件指纹进行签名,把签名写入到文件中,然后发送给客户。

但是,OpenSSL生成签名的函数:生成的是一个二进制的签名数据,还有这个数据的大小。我们需要对这个二进制数据进行编码,编码成一个字符串。OpenSSL有Base64的编码函数,我们可以拿来用。

我们可以用XML来保存编码后的字符串,以及编码后的数据大小。把这个XML文件保存成license.lic,这样就是一个许可证文件了:

ceb3adcb1846c310dbd0b630ac0e75a1.png

XML文件中的内容

fc1288f26aa947a4e538b0ddcbb2d79c.png

XML文件就是被设计用来传输数据的,Qt有XML文件读写的函数,后期有空的话我也会写相关的推送。

我们把这个license.lic发给客户,客户端程序解析出其中的编码后的签名,然后对其解码,解码成二进制数据,再传给OpenSSL的验证签名的函数。

客户端

  • 首先获取本机的硬件指纹

  • 读取从服务端发过来的license.lic文件,解析出其中的签名数据,用相同的方式对其进行解码,解码回二进制值。

  • 利用公钥对签名进行验证

  • 如果验证通过,才进入界面,不然直接退出

在利用公钥对签名验证这有点小问题:我们不能把公钥直接暴露给客户,如果客户用他自己的公钥来替换我的公钥那么就gg了!所以我们应该事先把公钥写入到程序中!但是OpenSSL的函数貌似只能从文件中读取公钥,所以这就麻烦了!下面我提供两种解决办法:

法1:使用Qt的情况下

我们可以把公钥文件放到资源文件里面,一块编译到程序中!但是这存在一个问题,Qt资源文件中的文件只能给Qt的库函数来读取标准C/C++中的函数是读不到Qt资源文件中的东西的!

  • 我们可以用QTemporaryDir来创建一个临时文件夹

  • 然后用QFile来读取资源文件中的公钥,把其中的字符串读出来

  • 在上面创建的临时文件夹中用QFile来创建一个文件,把公钥中的字符串写入到这个临时公钥文件里去。

  • 最后用OpenSSL的函数来读取这个临时文件夹中的临时的公钥文件。

  • QTemporaryDir对象删除时,临时文件夹也就删除了

这样就不用担心公钥泄露出去了!

法2:不用Qt的情况下

要不用Qt的话,就只能把公钥文件中的内容复制出来,放到一个字符串中,剩下的步骤还是和上面类似。

只不过这样就稍微麻烦点,万一我们换了密钥对的话,还得去改代码,要是用Qt就不用改代码了,直接把文件拷贝过去,重新编译下就行!

加密效果

没有许可证的情况下:

6631e0457355fd32d095e23c90481fec.png

点击ok

8b750f6b51eddd9cd97e98b5d327ca7d.png

必须要找我要许可证才行。

验证一下是否真的一台电脑只能用一个独一无二的许可证

我找我师弟帮我试了一下

开始时,发给他的是我自己电脑的许可证,他那用不了,如下图:

69e0dc333129fc8792f2639d26a7b431.png

后面他把他的计算机硬件指纹发给我,我生成了一个许可证发给他然后才能用!

dd471f73c7a0ad966c9c86da7d7202dc.png


最后打开是这样

初始化界面

7dfc85e92a707422d4722365813c3797.png

其他工作界面等

8cadef5b4e0894e9b5132df7db1f6de4.png

494310acd1a942cddecfbc07d297dc37.png

整个程序写了两周,乱七八糟的对一块,快上万行C++代码了(有用的估计顶多5000行不到吧),也算是对这断断续续学了一个多学期的C++/Qt有个大的复习了aa5ca87c19a8c8a7908fc0d04095c07c.png


cc71880b4d49fd0ca37e33a82cd5eef8.png

43fe3d3a2d4844389cc3c2f3ff30db9f.png43fe3d3a2d4844389cc3c2f3ff30db9f.png43fe3d3a2d4844389cc3c2f3ff30db9f.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值