环境搭建
本工具为qt工程,可在在Linux环境上运行,本博客以OpenEuler21.09为例作演示
安装qt5.12.12Linux版
点击官网链接
下载qt-opensource-linux-x64-5.12.12.run
文件,拷贝到OpenEuler上
点击直接运行
这里需要大家注册账号,qt会给注册时提供的邮箱发送一封激活邮件,点击链接即可激活,此处不再演示,点击Next
两个协议均要勾上,点击Next
选择安装路径
下面这一十分关键,若是直接Next会导致后续无法导入项目
将Qt5.12.12也要记得勾上
同意协议,之后就进入安装,需要等待5-10分钟
安装完成
导入Qt项目,多两次
龙脉密码钥匙mToken GM3000安装与激活
我们的工具使用了龙脉密码钥匙驱动,可以实现OpenSSL和mToken GM3000提供的算法
算法 | 默 认 长 度(bit) | 最 小 长 度(bit) | 最大长度(bit) |
---|---|---|---|
SGD_SM1_ECB | 128 | 128 | 256 |
SGD_SM1_CBC | 128 | 128 | 256 |
SGD_SM1_CFB | 128 | 128 | 256 |
SGD_SM1_OFB | 128 | 128 | 256 |
SGD_SM4_ECB | 128 | 128 | 256 |
SGD_SM4_CBC | 128 | 128 | 256 |
SGD_SM4_CFB | 128 | 128 | 256 |
SGD_SM4_OFB | 128 | 128 | 256 |
SGD_SM2_1 | 256 | 256 | 256 |
SGD_SM2_2 | 256 | 256 | 256 |
SGD_SM2_3 | 256 | 256 | 256 |
SGD_SM3 | 256 | 256 | 256 |
其中SGD_SM3是散列算法,SGD_SM2_1是签名验证算法,其余均为加解密算法
要在Linux环境下使用其接口进行开发首先需要在Window环境下初始化和激活
初始化
具体步骤可以参考博客windows下如何编译运行龙脉代码,总结一下就是先装中间件,再点击光盘驱动进行安装,最后进行初始化。这里仅强调比较重要的几个步骤。
在点击GM3000Admin.exe
后,可能会出现如下弹窗,也可能不会出现,若出现直接点“否”即可
在点击初始化时可能会出现如下弹窗(若在点击初始化时未出现上述的弹窗即一次性初始化成功)
点击“是”,输入SOPIN
:admin
提示操作成功,此时即初始化成功
激活
在初始化了多个USBkey后,我发现只有在Windows上经过Sample的使用激活,USBkey才能在Linux上被识别
首次在Windows上跑csp例程时会出现报错
此时再重新跑一次任意例程,会发现就不会有任何Failed的信息,均为OK
只有这个时候USBkey才能在Linux中被识别,否则直接在Linux中运行将一直运行不出结果,Hcontianer将为空
工具使用演示
该工具封装了OpenSSL的国密算法和龙脉mToken GM3000中的国密算法,并可以实现自由切换,下面结通过走一遍工具使用的完整流程来演示该工具如何使用
演示环境
接收方和发送方均为OpenEuler21.09,网络连接均为NAT模式,通过STATIC设置静态IP
- 接收方
IP的地址为192.174.168.138
- 发送方
IP地址为192.168.174.153
导入项目
首先找到qtcreator安装路径
进入Tools/QtCreator/bin
下图任选其一发送到桌面作为快捷方式,方便之后打开qtcreator
在接收方上打开qtcreator,点击“直接运行”
导入SMMessage-master项目的sender项目
选择sender.pro
导入成功,点击“Configure Project”即可继续编辑项目
右键点击项目,点击“构筑”或者左下角锤子进行编译
编译成功
之后即可运行
接收方也是相同的步骤导
界面展示
- 接收方
- 发送方
发送方和接收方仅是业务模型,在实际操作中双方均可实现发送和接收
证书生成
首先需要在接收方和发送方本地生成证书,在该工具中,接收方和发送方均作为自己的CA,为自己签发证书
- 接收方
- 输入命令
openssl ecparam -out receiverCA.key -name prime256v1 -genkey
生成接收方私钥receiverCA.key
文件
- 输入命令
openssl req -key receiverCA.key -new -out receiverCA.req
,根据私钥文件生成请求文件,并输入请求者信息,其中仅有Common Name一项为必填,其余均可直接回车
- 输入命令
openssl x509 -req -in receiverCA.req -signkey receiverCA.key -out receiverCA.pem
,根据请求文件和私钥生成receiver的证书,其中包含了证书持有者的信息(在请求阶段输入的信息)和公钥,格式为X509(便于工具中使用OpenSSL的X509相关接口直接提取)
其中证书的有效期默认为1个月,若想指定需在该命令中添加-days EXPIRED TIME
选项,EXPIRED TIME
的单位为天
- 输入命令
openssl ec -in receiverCA.key -out receiverpri.pem
,将receiverCA.key
文件转换成.pem
格式,便于工具中使用OpenSSl的PEM相关接口读取私钥信息
至此,接收方和证书相关的工作均部署完成,将包含接收方公钥的receiverCA.pem
证书发给发送方。在发送前,我们需要将双方的防火墙都关闭,便于socket和scp传输
- 防火墙的关闭
其中systemctl stop firewalld.service
是暂时防火墙关闭,systemctl disable firewalld.service
是永久关闭防火墙 - 通过
scp ./receiverCA.pem 192.168.174.153:/root/桌面/SMMessage-master/build-sender-Desktop_Qt_5_12_12_GCC_64bit-Debug/Cert
传输接收方证书,其中192.168.174.153是发送方的IP地址
传输成功
- 输入命令
发送方和接收方操作大体一致,下面仅做简单演示
- 发送方
openssl ecparam -out senderCA.key -name prime256v1 -genkey
生成接收方私钥senderCA.key
文件
openssl req -key senderCA.key -new -out senderCA.req
openssl x509 -req -in senderCA.req -signkey senderCA.key -out senderCA.pem
openssl ec -in senderCA.key -out senderpri.pem
- 传送文件
传输成功
OpenSSL SM4文件加密和签名
-
发送方选择要传输的文件
本工具能够传输任意类型的文件,包括文本、图片、视频等,下面先以图片为例详细介绍,再简单展示视频和文本的传输
-
发送方选择接收方证书
-
发送方选择发送方私钥
-
发送方点击“监听”
-
接收方指定发送方IP并点击“连接”
-
发送方点击“检测连接”
-
接收方点击“检测连接”
注意第8步和第9步的顺序不能更改,否则会报错或者直接断开连接 -
发送方点击“加密并签名”
显示文件保存路径
-
发送方点击 “发送密文”
-
接收方点击 “接收密文”
OpenSSL SM4文件验签和解密
-
接收方选择密文进行解密
-
接收方选择发送方公钥
-
接收方选择自己私钥
-
接收方点击解密并验签,解密成功
-
验签成功
-
检查解密后的文件
与发送方的图片对比
传输成功
文本文件传输演示 -
选择文件并进行加密签名
-
发送加密且签名后的文件
-
接收文件成功
4。 查看接收文件,并选择其为待验签解密文件
-
解密成功
-
验签成功
视频文件传输演示 -
对视频文件进行签名和加密
-
发送加密签名后的文件
-
接收方接收文件
-
接收方解密验签
验签成功
检验视频
对比原发送文件
完全一样
mToken GM3000 SM4加密
- 选择图片进行加密,加密成功,此时发送方需要插上USBkey
mToken GM3000 SM4解密
- 发送方将文件传输给接收方
- 接收方接收密文
- 接收方解密
mToken GM3000 SM1加密
- 选择图片进行加密,加密成功
mToken GM3000 SM1解密
- 发送方将文件传输给接收方
- 接收方接收密文
- 接收方解密,注意此时接收方也需要插上USBkey
mToken GM3000 SM2签名
- 发送方签名
mToken GM3000 SM2验签
- 发送方发送签名的文件
- 接收方接受被签名的文件
- 验签
验签成功