跳转至

04 gmssl国密算法

作者:沈园园 | 最后修改:2026-04-27

一、gmssl 介绍

GMSSL 是一个支持国家密码算法(国密算法) 的开源密码工具库,由中国科学院软件研究所等机构开发,兼容国际密码标准的同时,重点实现了我国自主设计的密码算法(SM 系列),广泛用于国内金融、政务、通信等需符合国家密码标准的领域。

1.1 GMSSL 核心功能

GMSSL 提供了与 OpenSSL 类似的功能,但特别强化了国密算法支持,主要包括:

  • 国密算法实现(SM2/SM3/SM4 等)
  • 证书管理(支持国密标准证书格式)
  • 加密 / 解密、签名 / 验签、密钥交换等密码操作

1.2 核心国密算法(SM2/SM3/SM4)详解

1、SM2:椭圆曲线公钥密码算法

  • 类型:非对称加密算法(公钥密码算法)
  • 作用:替代 RSA、ECC 等国际算法,用于数字签名、密钥交换、公钥加密
  • 特点
  • 基于椭圆曲线密码(ECC),密钥长度 256 位(安全强度相当于 RSA 2048 位)。
  • 签名和加密效率优于 RSA,相同安全级别下密钥更短,适合资源受限场景(如嵌入式设备)。
  • 采用国家规定的椭圆曲线参数(SM2p256v1),确保算法合规性。
  • 应用场景:电子签名(如合同签署)、身份认证、密钥协商(如 VPN 密钥交换)。

2、SM3:密码杂凑算法

  • 类型:哈希算法(杂凑函数)
  • 作用:替代 SHA-256 等,用于数据完整性校验、数字签名摘要生成
  • 特点
  • 输出固定长度 256 位(32 字节)哈希值。
  • 具备强抗碰撞性(难以找到两个不同数据生成相同哈希值)。
  • 计算效率与 SHA-256 相当,安全性满足国家密码标准。
  • 应用场景:数字签名的摘要计算(与 SM2 配合使用)、数据校验(如文件完整性验证)、区块链交易哈希(部分国产区块链采用)。

3、SM4:分组密码算法

  • 类型:对称加密算法
  • 作用:替代 AES 等,用于敏感数据加密 / 解密
  • 特点
  • 分组长度 128 位,密钥长度 128 位,加密模式支持 ECB、CBC、GCM 等。
  • 加密效率与 AES 相当,适合批量数据加密。
  • 算法设计公开,安全性经过严格验证。
  • 应用场景:数据库加密、文件加密、VPN 数据传输加密、政务系统敏感信息保护。

二、演示功能概述

演示gmssl国密算法包含SM2算法, 含密钥生成,SM3算法,SM4算法以及SM2签名和验签;

三、准备硬件环境

参考:硬件环境清单,准备以及组装好硬件环境。

1、Air1601开发板一块

2、TYPE-C USB数据线一根

3、Air1601开发板和数据线的硬件接线方式为

  • Air1601开发板通过TYPE-C USB口连接TYPE-C USB 数据线,数据线的另外一端连接电脑的USB口;
  • 在 Air1601 开发板上丝印标注 USB1,为芯片烧录下载接口;
  • 若遇到因电脑 USB 端口供电不足导致的烧录失败,也可改用外部稳压电源通过开发板上的 VIN 引脚进行供电;

购买链接:Air1601开发板 多功能5寸RGB屏 支持AirUI 摄像头 代开发固件-淘宝网

四、准备软件环境

4.1 软件环境

在开始实践本示例之前,先筹备一下软件环境:

1、烧录工具:Luatools 下载调试工具

2、内核固件(底层 core 固件文件):

本demo开发测试时使用的固件为LuatOS-SoC_V1004_Air1601.soc,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试。

3、luatos 需要的脚本和资源文件

准备好软件环境之后,接下来查看如何烧录项目文件到 Air1601 开发板中,将本篇文章中演示使用的项目文件烧录到Air1601开发板 中。

4.2 API 介绍

gmssl 库:https://docs.openluat.com/osapi/core/gmssl/

五、程序结构

miniz/
│── main.lua
│── gmssl_sm2.lua
│── gmssl_sm3.lua
│── gmssl_sm4.lua
│── gmssl_sm2sign.lua
│── readme.md

5.1 文件说明

  1. main.lua:主程序入口文件。
  2. gmssl_sm2.lua:SM2算法, 含密钥生成。
  3. gmssl_sm3.lua:SM3算法。
  4. gmssl_sm4.lua:SM4算法。
  5. gmssl_sm2sign.lua:SM2签名和验签。

六、代码详解

6.1 main.lua

主程序文件 main.lua 是整个项目的入口点。它负责初始化系统环境。

6.2 gmssl_sm2.lua

SM2算法加解密,含密钥生成。

function gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
    -- GMSSL默认格式
    log.info("==== SM2 默认GMSSL模式")
    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
    log.info("sm2默认模式", "加密后", encodeStr and  string.toHex(encodeStr))
    if encodeStr then
        log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
    end


    -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
    -- 密文格式 C1C3C2, 新国标, 一般是这种
    log.info("==== SM2 网站兼容模式")
    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
    log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and  string.toHex(encodeStr))
    if encodeStr then
        log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
    else
        log.info("解密失败")
    end
    -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
    log.info("==== SM2 网站兼容模式, 但C1C2C3")
    local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
    log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and  string.toHex(encodeStr))
    if encodeStr then
        log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
    else
        log.info("解密失败")
    end
end


local function gmssl_sm2_task_func()
    -- 未加密字符串
    local originStr = "!!from LuatOS!!"

    -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
    -- 就当前实现还是比较慢的
    if gmssl.sm2encrypt then -- 部分BSP不支持
        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
    end

    -- SM密钥生成
    if gmssl.sm2keygen then
        log.info("SM2密钥生成测试")
        originStr = "32wrniosadnfvnadsio;fasiow"
        local pkx, pky, private = gmssl.sm2keygen()
        gmssl_sm2_encrypt_decrypt(originStr, pkx, pky, private)
    end

end

sys.taskInit(gmssl_sm2_task_func)

6.3 gmssl_sm3.lua

SM3算法,算HASH值。

local function gmssl_sm3_task_func()
    -- sm3算法,算HASH值
    local encodeStr = gmssl.sm3("lqlq666lqlq946")
    log.info("gmssl.sm3",string.toHex(encodeStr))

    -- sm3算法,算HASH值,但带HMAC
    local encodeStr = gmssl.sm3hmac("lqlq666lqlq946", "123")
    log.info("gmssl.sm3hmac",string.toHex(encodeStr))    

end

sys.taskInit(gmssl_sm3_task_func)

6.4 gmssl_sm4.lua

SM4算法加解密。

local function gmssl_sm4_task_func()

    if gmssl.sm4encrypt then
        log.info("=== SM4测试")
        local passwd = "1234567890123456"
        local iv = "1234567890666666"
        -- SM4 算法, 对称加密
        originStr = ">>SM4 ECB ZeroPadding test<<"
        --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;
        encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
        log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
        log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))

        originStr = ">>SM4 ECB Pkcs5Padding test<<"
        --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;
        encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
        log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
        log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))

        originStr = ">>SM4 CBC Pkcs5Padding test<<"
        --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;偏移量:1234567890666666
        encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
        log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
        log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))

        -- 完全对齐16字节的对比测试
        originStr = "1234567890123456"
        encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
        log.info("sm4.ecb.pkcs7", encodeStr:toHex())
        encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
        log.info("sm4.ecb.pkcs5", encodeStr:toHex())
        encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
        log.info("sm4.ecb.zero", encodeStr:toHex())
        encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
        log.info("sm4.ecb.none", encodeStr:toHex())
    end
end

sys.taskInit(gmssl_sm4_task_func)

6.5 gmssl_sm2sign.lua

SM2签名和验签。

local function gmssl_sm2sign_task_func()

    -- SM2签名和验签
    if gmssl.sm2sign then
        local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
        local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
        local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
        local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"

        -- 不带id的情况,即默认id="1234567812345678"
        local sig = gmssl.sm2sign(private, originStr, nil)
        log.info("sm2sign", sig and sig:toHex())
        if sig then
            local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
            log.info("sm2verify", ret or "false")
        end

        -- 带id的情况
        local id = "1234"
        local sig = gmssl.sm2sign(private, originStr, id)
        log.info("sm2sign", sig and sig:toHex())
        if sig then
            local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
            log.info("sm2verify", ret or "false")
        end
    end
end

sys.taskInit(gmssl_sm2sign_task_func)

七、运行结果展示

出现类似于下面的日志,就表示运行成功:

[2026-03-03 14:14:38.600][LTOS/N][000000000.016]:I/user.==== SM2 默认GMSSL模式
[2026-03-03 14:14:38.602][LTOS/N][000000000.120]:I/user.sm2默认模式 加密后 307802206473DF9A4B493439E5C90E231062E019F3659FADBA1C90E7C281D9ADA399D792022100CDE20038FE8BEA743E81666919EA0145A5269C82ECB0A2B3DAE36242989797770420FC9473A4E13B4D34F188580C3CBF3E4CB5D2CA34A6C894A793582C6F74C4DD0D040FBE776C5723DF3ACEE7DA2627D3D4DB
[2026-03-03 14:14:38.607][LTOS/N][000000000.172]:I/user.sm2默认模式 解密后 !!from LuatOS!!
[2026-03-03 14:14:38.611][LTOS/N][000000000.172]:I/user.==== SM2 网站兼容模式
[2026-03-03 14:14:38.715][LTOS/N][000000000.275]:I/user.sm2网站兼容模式 C1C3C2 加密后 EE36D638DFB8CE9F993B96035EE5A9910C8B9ADB296F6AB8EF9E28C4465D2E37F643311861EE5D8E58C63CAFE1F162DCC772DD9F16199E923E793989F7C528F2F872188D6DC88AEA67CFD5A60C72944A515ABE845EE9E0FB71E4FA344E557C2AB35B1B51144DA0AA145DA7D9A97943
[2026-03-03 14:14:38.763][LTOS/N][000000000.328]:I/user.sm2网站兼容模式 C1C3C2 解密后 !!from LuatOS!!
[2026-03-03 14:14:38.763][LTOS/N][000000000.328]:I/user.==== SM2 网站兼容模式, C1C2C3
[2026-03-03 14:14:38.874][LTOS/N][000000000.432]:I/user.sm2网站兼容模式 C1C2C3 加密后 0482361A4410432D5D037F553D2348D7A882AD84A99C08D9C0F2335F0F5F57AD7BC1D73A2FF9948DE809076D6419E8872854DC813AC72E6C295D2A861CFD535DB3BF5E948FCA644C10C70AB075D77DDFD78AE661237025913B1001FA0B576F76BCE138E2ABE060B4D72042D99284FFFC
[2026-03-03 14:14:38.921][LTOS/N][000000000.485]:I/user.sm2网站兼容模式 C1C2C3 解密后 !!from LuatOS!!
[2026-03-03 14:14:38.921][LTOS/N][000000000.485]:I/user.SM2密钥生成测试
[2026-03-03 14:14:38.985][LTOS/N][000000000.540]:I/user.==== SM2 默认GMSSL模式
[2026-03-03 14:14:39.080][LTOS/N][000000000.647]:I/user.sm2默认模式 加密后 308182022010B4FEA8F268A052A0ABC8D1566ECC1AD55E3F9BD39976AF37D84A8967B3EC6102200B1BAB5E8480B62744DCB8F9666EA76A5F45F3700E943B50F5540A017262F8DC04200B736FDEFDA95A0CC40DE2C0CD5A26F56C56C1F37D011DC4399EBD9D5788241F041AAF8FD33C9E97BB1D13B6DCB2B6B12038E69E64AB09668ACCDA51
[2026-03-03 14:14:39.143][LTOS/N][000000000.701]:I/user.sm2默认模式 解密后 32wrniosadnfvnadsio;fasiow
[2026-03-03 14:14:39.143][LTOS/N][000000000.701]:I/user.==== SM2 网站兼容模式
[2026-03-03 14:14:39.254][LTOS/N][000000000.809]:I/user.sm2网站兼容模式 C1C3C2 加密后 21C7A99352FC5F20F3A4BAF12DD36FC1C09849C12C90C9F9EF75930B28F11460E3CB6E612380BB4FA32ED6F7B32A11C3DF6B1DBDE333EEF8B8AB35CEC461A8A56535354287487E4A9D2962DFB27552119A103C9BD7237851EEB08F79D0F4A26BAA24D79AE014B942BCE2E64C7F59990DB295228BF2B325BF7BEF
[2026-03-03 14:14:39.301][LTOS/N][000000000.865]:I/user.sm2网站兼容模式 C1C3C2 解密后 32wrniosadnfvnadsio;fasiow
[2026-03-03 14:14:39.301][LTOS/N][000000000.865]:I/user.==== SM2 网站兼容模式, C1C2C3
[2026-03-03 14:14:39.411][LTOS/N][000000000.974]:I/user.sm2网站兼容模式 C1C2C3 加密后 04F9B801E8D5CC74B81F8AC5370C32469F92ADFCF53A880496CC78047C4BFAD1E0C25C83E112E1BD9E5A461D7423C25DE257823EAB3ED29499DAEB566248FCF50E00FB665ACF2EBCF69011840EBE655358B7A6AF5F64CFFF1F81E4BC04824F47F8D799B6B32FFFE925F2C77C8901D468E8CAF3C8CEEB8A7F141FEB
[2026-03-03 14:14:39.474][LTOS/N][000000001.030]:I/user.sm2网站兼容模式 C1C2C3 解密后 32wrniosadnfvnadsio;fasiow
[2026-03-03 14:14:39.479][LTOS/N][000000001.031]:D/heap skip ROM free 1470062a
[2026-03-03 14:14:39.479][LTOS/N][000000001.031]:D/heap skip ROM free 1470080e
[2026-03-03 14:14:39.479][LTOS/N][000000001.031]:D/heap skip ROM free 14700078
[2026-03-03 14:14:39.492][LTOS/N][000000001.031]:D/heap skip ROM free 14700905
[2026-03-03 14:14:39.496][LTOS/N][000000001.033]:I/user.gmssl.sm3 E64FD76F4078E51DCA428323D3FADBD5D52723BBF1379184650DA5CE6002B2BF 64
[2026-03-03 14:14:39.496][LTOS/N][000000001.033]:I/user.gmssl.sm3hmac FBB67FC936777011AA70336F0F0B6305D529A97A87D8ECA8880472CD2C30A721 64
[2026-03-03 14:14:39.496][LTOS/N][000000001.034]:D/heap skip ROM free 14700f28
[2026-03-03 14:14:39.506][LTOS/N][000000001.034]:D/heap skip ROM free 14701000
[2026-03-03 14:14:39.506][LTOS/N][000000001.034]:D/heap skip ROM free 14700ee3
[2026-03-03 14:14:39.506][LTOS/N][000000001.034]:D/heap skip ROM free 1470109d
[2026-03-03 14:14:39.506][LTOS/N][000000001.036]:I/user.=== SM4测试
[2026-03-03 14:14:39.521][LTOS/N][000000001.037]:I/user.sm4.ecb.zero 加密后 E8DF19897C0BF1FFA50910C5C548F5A4E9E34BED9F5CEE519CFA24C37A290B25 64
[2026-03-03 14:14:39.529][LTOS/N][000000001.037]:I/user.sm4.ecb.zero 解密后 >>SM4 ECB ZeroPadding test<<
[2026-03-03 14:14:39.535][LTOS/N][000000001.037]:I/user.sm4.ecb.pks5 加密后 25B3D6AB8C855115C3A8883FE3ADCC6B9004C83B86CE7A45517CA6736DBA4EFE 64
[2026-03-03 14:14:39.537][LTOS/N][000000001.038]:I/user.sm4.ecb.pks5 解密后 >>SM4 ECB Pkcs5Padding test<<
[2026-03-03 14:14:39.541][LTOS/N][000000001.038]:I/user.sm4.cbc.pks5 加密后 A11C24BB018C8124FADAFC9B6BF7932C05BA2F24E9DFB9D79D982A676F9C010C 64
[2026-03-03 14:14:39.551][LTOS/N][000000001.038]:I/user.sm4.cbc.pks5 解密后 >>SM4 CBC Pkcs5Padding test<<
[2026-03-03 14:14:39.553][LTOS/N][000000001.038]:I/user.sm4.ecb.pkcs7 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
[2026-03-03 14:14:39.553][LTOS/N][000000001.039]:I/user.sm4.ecb.pkcs5 B083DCC0A9F64BD9FAE2FA8C936E3D776C88F739AF2A29A735381F5677BADEF7 64
[2026-03-03 14:14:39.564][LTOS/N][000000001.039]:I/user.sm4.ecb.zero B083DCC0A9F64BD9FAE2FA8C936E3D77D2D68ED9FE06CB40C9A150AA5917F15F 64
[2026-03-03 14:14:39.564][LTOS/N][000000001.039]:I/user.sm4.ecb.none B083DCC0A9F64BD9FAE2FA8C936E3D77 32
[2026-03-03 14:14:39.569][LTOS/N][000000001.040]:D/heap skip ROM free 14701183
[2026-03-03 14:14:39.569][LTOS/N][000000001.040]:D/heap skip ROM free 14701593
[2026-03-03 14:14:39.569][LTOS/N][000000001.040]:D/heap skip ROM free 1470113e
[2026-03-03 14:14:39.569][LTOS/N][000000001.040]:D/heap skip ROM free 1470184e
[2026-03-03 14:14:39.585][LTOS/N][000000001.151]:I/user.sm2sign CB0A9B73D623D0841D80F5FCF80B5A193C4AB22C301DDAAB6DC6D8F188F7056A83E7CE50E1EE7A939ECA7F305603E66671C600A0BA36B116A32C727E5A0923E6
[2026-03-03 14:14:39.696][LTOS/N][000000001.256]:I/user.sm2verify true
[2026-03-03 14:14:39.807][LTOS/N][000000001.366]:I/user.sm2sign 997CA264EB3A6C01F28A21DE53EFC656B643EB940472AC92CA183F17B7599074FA49A79972E7BB28528B4BF601E5BE0BDCF5F5DA6856D073ABDA594186BED7B3
[2026-03-03 14:14:39.903][LTOS/N][000000001.472]:I/user.sm2verify true

八、总结

通过本文学习,你可以学习到gmssl国密算法(SM2/SM3/SM4)的使用方法。