一、国密算法 SM1-SM4 科普

1.1 什么是国密算法?

国密算法(国产密码算法)是由国家密码管理局发布的一系列商用密码算法标准,主要包括 SM1、SM2、SM3、SM4。在工业物联网、智慧城市、政务系统、智慧水务等领域应用广泛,满足合规与数据安全要求。

1.2 算法分类一览

类型 算法 说明
对称加密 SM1 分组密码,仅硬件实现,算法不公开
对称加密 SM4 分组密码,软件/硬件均可,最常用
非对称加密 SM2 椭圆曲线公钥算法,数字签名、密钥交换、加密
哈希算法 SM3 密码杂凑算法,256 位输出,完整性校验

1.3 各算法简要说明

SM1(对称加密,仅硬件)

1.密钥/分组长度:128 位  
2.特点:
算法不公开,仅以芯片形式提供,安全性高、成本高  
3.典型场景:金融 POS/ATM、高安全政务系统  

SM2(非对称加密)

1.密钥长度:256 位(公钥、私钥)  
2.标准:
GB/T 32918-2016  
3.功能:
数字签名、密钥交换、数据加密  
4.典型场景:
身份认证、电子签章、物联网设备认证、密钥协商  

SM3(哈希算法)

1.输出长度:256 位(32 字节)  
2.标准:GB/T 32905-2016  
3.特点:不可逆、固定长度、雪崩效应、抗碰撞  
4.典型场景:数据完整性校验、与 SM2 配合做数字签名、密码存储  

SM4(对称加密,最常用)

1.密钥长度:128 位(16 字节)  
2.分组长度:128 位(16 字节)  
3.标准:GB/T 32907-2016  
4.特点:算法公开、可软件实现、性能好、成本低,**物联网数据传输加密首选**  
5.加密模式:ECB、CBC、CFB、OFB、CTR 等  
6.典型场景:MQTT/HTTP 数据加密、数据库/文件加密、水务/工业数据上云  

记忆口诀:  

SM1:硬件专供、高安全  
SM2:签名、认证、密钥交换  
SM3:哈希、完整性  
SM4:数据加密、上云传输首选  

二、为什么 IG502 上云推荐用 SM4?

合规:符合国密标准,满足行业与政策要求。  
性能:对称加密,适合网关侧对采集数据做实时加密。  
成本:无需专用加密芯片,软件即可实现。  
生态:Python 有现成国密库(如 gmssl),便于在 DeviceSupervisor Agent 的快函数中集成。  

典型链路:设备数据 IG502 采集 SM4 加密 MQTT 发布云端解密入库

三、IG502 与 DeviceSupervisor Agent 简介

IG502:映翰通边缘计算网关,支持蜂窝/以太网接入、Python 二次开发,可内置 DeviceSupervisor Agent(DSA)服务。  
DSA:支持多种南向采集协议(如 Modbus、OPC 等),北向支持标准 MQTT、MQTT SparkPlugB、阿里云 IoT、AWS IoT、Azure IoT 等,数据经“采集 → 处理 → 发布”后上云。  

MQTT 上云时,可在 发布脚本(快函数) 里对 payload 做 SM4 加密,云端再按相同算法解密。

四、IG502 使用 SM4 加密数据上传 MQTT 的完整操作流程

整体流程:准备 SM4 库 → 配置 MQTT 云服务 → 配置发布脚本(含 SM4 加密)→ 可选:订阅与云端解密

4.1 准备 SM4 加密库

1.在 PC 上准备 SM4加密包的 Python 包。  
2.通过 IG502 的 第三方库管理 将 gmssl 导入到网关,供 DSA 快函数使用。  按照DAS说明书将包和info文件打包成相应文件格式的压缩包。

3.打包最好使用Windows命令行的方式,在命令行中输入打包命令,

4.完成打包后,在网关第三方库管理中上传库,上传成功后如图显示,

5.如果上传不成功,网关会提示上传不成功,可以在app的日志中查看具体原因,如果是这样,表示打包不成功,没有识别到info文件,可以重新打包,或者换一种打包格式,比如刚开始是zip,可以换成tar.gz格式

4.2 配置 MQTT 云服务

1. 登录 IG502 的 DeviceSupervisor Agent 管理界面。  
2. 进入 云服务 → MQTT 云服务。  
3. 启用云服务,云平台类型选择 “标准 MQTT”。  
4. 配置基本参数:  
   服务器地址:MQTT Broker 地址(如 `broker.emqx.io` 或自建服务器)。  
   MQTT 客户端 ID:唯一标识,避免与其它设备冲突。  
   端口号:如 1883(非 TLS)、8883(TLS)。  
5. 可选:  
   启用用户验证:填写 MQTT 用户名/密码。  
   TLS 加密:需要时开启,实现“传输层 TLS + 应用层 SM4”双重保护。  
6. 点击 提交,确认状态栏显示 连接成功

4.3 配置发布消息(SM4 加密)

1. 在 消息管理 → 发布 中 添加 一条发布消息。  
2. 配置项建议:  
   名称:如 `test6`(名称在消息管理中需唯一)。  
   数据源类型:测点数据(或按需选告警数据)。  
   分组/标签:选择要上云的测点分组。  
   Topic: `inhand_sub`
   Qos(MQTT):1。  
   入口函数:`main`。  
3. 函数代码:使用下面提供的 SM4 加密发布脚本。  
4. 提交保存。

4.4 密钥管理(重要)

SM4 密钥为 16 字节(128 位),加密端与解密端必须一致。  
不要在脚本中写死密钥;建议在 系统 → 自定义参数中增加参数(如 `sm4_key`),值为 16 字节密钥的 Base64 编码,在脚本中通过 `get_global_parameter()` 读取并 Base64 解码后使用。  
生产环境应定期更换密钥,并同步到云端。

五、MQTT 上传代码怎么写(发布)

5.1 网关设置

首先,创建云服务上传数据,在云服务处,启动云服务,设置需要上传数据的一些参数,如图所示:

注意:MQTT服务器连接成功需要网关可以通外网,通过连接WiFi或者插SIM卡的方式联网。

在发布消息处设置相关参数与配置:测点数据分组了要注意别选错了,设置topic,完成后编写代码,在代码中可以引用刚刚导入的库文件,代码写完后确认就可以使用SM4加密消息,将加密的数据上传至MQTT云平台。

5.2 日志查看

可以通过日志查看使用SM4加密是否成功,成功后上传的数据是什么,

也可以使用MQTT服务器去查看。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐