目录
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中
1.2 开始编译
安装 perl 记得勾选 添加到路径
把nasm.exe所在路径添加到环境变量中
把 dmake.exe 拷贝到 perl路径/site/bin 中去
打开VS的这个命令行(要右键,以管理员身份运行)
输入:
cd 你的OpenSSL源码路径
perl Configure VC-WINA --prefix 输出目录
然后
nmake
中间得等一会!
nmake install
等个好一会就好了。
我们需要从源码目录
的 ms目录下 把 applink.c 文件拷贝到输出目录的 include 目录
中。在写程序的时候要把这个applink.c 包含到使用OpenSSL库函数的Cpp文件中(不要放在头文件中包含,直接在main.cpp中包含进来就行)
编译好后:
采用OpenSSL对软件进行加密
这部分不分享源码了,源码太太太多了,也不方便整理,简单说说思路吧。
其实,思路还是和上次的那篇推送一样,不过,上次是用Python做的,这回是用C++做。
服务端上
直接采用编译出来的OpenSSL的可执行程序来生成公私密钥对,或者采用OpenSSL的函数来生成也行。密钥对生成一次就够了。
利用私钥
,对客户发送过来的计算机硬件指纹进行签名,把签名写入到文件中,然后发送给客户。
但是,OpenSSL生成签名的函数:生成的是一个二进制的签名数据,还有这个数据的大小。我们需要对这个二进制数据进行编码,编码成一个字符串。OpenSSL有Base64的编码函数,我们可以拿来用。
我们可以用XML来保存编码后的字符串,以及编码后的数据大小。把这个XML文件保存成license.lic
,这样就是一个许可证文件了:
XML文件中的内容
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就不用改代码了,直接把文件拷贝过去,重新编译下就行!
加密效果
没有许可证的情况下:
点击ok
后
必须要找我要许可证才行。
验证一下是否真的一台电脑只能用一个独一无二的许可证
我找我师弟帮我试了一下
开始时,发给他的是我自己电脑的许可证,他那用不了,如下图:
后面他把他的计算机硬件指纹发给我,我生成了一个许可证发给他然后才能用!
最后打开是这样
初始化界面
其他工作界面等
整个程序写了两周,乱七八糟的对一块,快上万行C++代码了(有用的估计顶多5000行不到吧),也算是对这断断续续学了一个多学期的C++/Qt有个大的复习了