基于GMSSL实现的sm2加解密在vscode实现(C++)(自用)


原文地址:https://blog.csdn.net/hacker_lpy/article/details/124211114
原文改进方案地址:https://blog.csdn.net/canlynetsky/article/details/131212028
本人最近刚刚开始学习Linux下的C++开发,不太习惯命令行编译程序,听说vscode挺好用,于是开始尝试使用vscode来编写程序,以下记录自己在跑通原文案例时遇到的一些问题。
本文使用的是gmutil.so动态库,使用时只需要包含头文件gmutil.h和gmutil.so动态库,封装的成动态库的目的是屏蔽openssl的头文件和符号,避免和其他版本的openssl产生冲突,达到多个openssl版本共存的目的(摘自原博客README.txt)

GMSSL库安装

gmssl库的安装参考文章https://blog.csdn.net/zyhse/article/details/112350363

编写项目过程

标准写程序流程:
1.创建文件夹打开vscode
2.创建文件夹include;lib;src;其中include放头文件;lib放引用库文件;src放源文件。
3.点击调试代码按钮,系统会自动生成tasks.json,也可以在设置中创建c_cpp_properties.json,launch.json,settings.json;个人觉得最有用的是tasks.json。
4.配置好json文件后继续运行代码生成可执行文件
5.测试结果

SM2公私钥对的生成

生成pem格式的私钥和der格式的公钥

gmssl ecparam -genkey -name sm2p256v1 -noout -out sm2-private-key.pem//生成pem格式的私钥
gmssl ec -pubout -in sm2-private-key.pem -outform DER -out sm2-public-key.der//生成der格式的公钥

将pem格式私钥转化为key格式

gmssl ec -in sm2-private-key.pem -outform PEM -out sm2-private-key.key//将pem格式私钥转化为key格式

将der格式的公钥转化为base64编码格式,跟Ubuntu版本有关,可能有的是别样的写法。

base64 < sm2-public-key.der > sm2-public-key.base64//将der格式的公钥转化为base64编码格式

将base64编码格式的公钥转化为key格式私钥

mv sm2-public-key.base64 sm2-public-key.key//将base64编码格式的公钥转化为key格式私钥

JSON文件配置

下面细说一下json文件的一些参数,主要是tasks.json的配置,主要需要引用三个库文件,分别是libcrypto.a,libssl.a,libgmutil.so:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ 生成活动文件",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                //下面句子表示你要编译的源文件,*.cpp表示该目录下的所有cpp文件
                "*.cpp",
                //-I后跟的路径表示头文件所在目录,若有多个目录就写多个-I
                "-I${workspaceFolder}/include",
                "-I${workspaceFolder}/include/openssl",
              	//-L后跟的是库目录的路径
                "-L${workspaceFolder}/lib",
                //-l表示的是引用的动态库或静态库文件,不用写前缀lib和后缀.*,如我这里是libcrypto.a和libssl.a和libgmutil.so
                "-lcrypto",
                "-lssl",
                "-lgmutil",
                //-o表示输出可执行文件的路径,切记-o要放在-L之后
                "-o",
                "${workspaceFolder}/test"
            ],
            //剩下的设置不是很重要,不需要改
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        },
      
}

运行结果

请添加图片描述

SM2在线密解工具用法

首先贴出sm2在线密接网站:https://the-x.cn/zh-cn/cryptography/Sm2.aspx

本文程序第一部分通过公钥加密生成并打印密文,第二部分是输入一段密文,直接进行解密得出二进制明文,因此使用在线解密工具验证第一部分我们需要在左侧下边框里写入密文,在上边框写入我们的私钥,点击SM2私钥解密得出明文“登录消息”
请添加图片描述

验证第二部分我们同样放入私钥与欲加密明文,点击SM2私钥解密验证结果是否与代码生成结果一样即可。
请添加图片描述

请添加图片描述
对比发现两次结果相同,证明SM2加密解密代码正常运行。

关于strCipherTextHex内容的填写:
先用SM2公钥对欲加密消息进行加密,代码中生成二进制密文→十六进制密文→字符串格式,即为strCipherTextHex,将内容放入下图红框中的地方,对应私钥即可解密出原明文了,若使用其他私钥去进行解密,则会报错Sm2Decrypt fail解密失败。
请添加图片描述
使用其他公钥对应的私钥解密报错Sm2Decrypt fail解密失败。
请添加图片描述

之后可以尝试一下命令行编译与CMake编译,继续学习Linux下的C++开发。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值