国密sm4加密

news/2025/3/20 16:14:23/文章来源:https://www.cnblogs.com/erfeng/p/18783303

国密sm4-golang使用

sm4

国密SM4算法是一种分组加密算法。SM4分组密码(block cipher)算法是一种迭代分组密码算法,由加解密算法和密钥扩展算法组成。

SM4是一种Feistel结构的分组密码算法,其分组长度和密钥长度均为128bits。加密算法和密钥扩展算法迭代轮数均为32轮。SM4加解密过程的算法相同但是轮密钥的使用顺序相反

开发

这里我们使用 gmsm库来实现国密sm4算法的加密和解密

https://github.com/emmansun/gmsm

封装代码

package sm4import ("crypto/cipher""encoding/base64""github.com/emmansun/gmsm/sm4"
)
func Encrypt(SrcData []byte, appKey, appIv string) (string, error) {key, _ := base64.StdEncoding.DecodeString(appKey)iv, _ := base64.StdEncoding.DecodeString(appIv)block, _ := sm4.NewCipher(key)// 手动填充SrcData = pkcs5Padding(SrcData, 16)// CTR 模式加密stream := cipher.NewCTR(block, iv)ciphertext := make([]byte, len(SrcData))stream.XORKeyStream(ciphertext, SrcData)// Base64 编码加密结果return base64.StdEncoding.EncodeToString(ciphertext), nil
}func Decrypt(base64Data string, appKey, appIv string) ([]byte, error) {key, _ := base64.StdEncoding.DecodeString(appKey)iv, _ := base64.StdEncoding.DecodeString(appIv)block, err := sm4.NewCipher(key)if err != nil {return nil, err}// Base64 解码密文ciphertext, err := base64.StdEncoding.DecodeString(base64Data)if err != nil {return nil, err}// CTR 模式解密stream := cipher.NewCTR(block, iv)plaintext := make([]byte, len(ciphertext))stream.XORKeyStream(plaintext, ciphertext)// 手动去除填充plaintext, err = pkcs5UnPadding(plaintext)return plaintext, nil
}// PKCS5Padding 填充
func pkcs5Padding(data []byte, blockSize int) []byte {padding := blockSize - len(data)%blockSizepadText := make([]byte, padding)for i := range padText {padText[i] = byte(padding)}return append(data, padText...)
}// PKCS5UnPadding 去除填充
func pkcs5UnPadding(data []byte) ([]byte, error) {length := len(data)if length == 0 {return nil, errors.New("解密数据为空")}paddingLen := int(data[length-1])if paddingLen > length || paddingLen > 16 {return nil, errors.New("填充长度不正确")}return data[:length-paddingLen], nil
}func DecodeSecretKey(secret string) string {decodeData, _ := base64.StdEncoding.DecodeString(secret)return string(decodeData)
}

注意⚠️:一些平台在使用sm4的使用对外提供的appKeyappIV可能并不是事件用到的密钥,可能是随机数种子,需要你去自己二次生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902063.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KUKA库卡KR360_R2830机械臂维修减速机卡住了

库卡机器人维修减速机卡死,作为一种常见的机械故障,其成因往往复杂多样,通常可以归结为长时间的高强度工作、外部异物的侵入、安装过程中的疏忽以及润滑系统的失效等多种因素。以下是对这一故障常见原因的详尽阐述,以及一些实用的维修建议:库卡机器人减速机卡死现象的根源…

【原厂】点阵LED数码管驱动/内置显示RAM为8x16位-LED显示驱动芯片VK1640 SOP28

产品品牌:永嘉微电/VINKA 产品型号:VK1640 封装形式:SOP28 概述 VK1640是一种数码管或点阵LED驱动控制专用芯片,内部集成有数据锁存器、LED 驱 动等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx16GRID的点阵LED显示。 适用于小型LED显示屏驱动。采用SOP28的封装形式…

portainer学习笔记1

Portainer是一款非常好用的docker容器管理平台,部署也很easy。# 创建portainer数据卷 docker volume create portainer_data # 拉取镜像启动portainer docker run -d -p 8000:8000 -p 9443:9443 \ --name portainer --restart=always \ -v /var/run/docker.sock:/var/run/dock…

安装Python保姆级教程(Pycharm破解码+解释器安装)

一、进入Python官网首页,下载最新的Python版本 https://www.python.org/downloads/ 选择最新的Python3.10.5,下载64位的版本 二、下载完成后,进行安装 1.双击Python-3.10.5-amd64.exe 3.出现此页面表示安装成功 三、运行Python 1.Win+R打开控制台,输入Python 此时出现了一…

dify知识库

一、概述 知识库功能将 RAG 管线上的各环节可视化,提供了一套简单易用的用户界面来方便应用构建者管理个人或者团队的知识库,并能够快速集成至 AI 应用中。 开发者可以将企业内部文档、FAQ、规范信息等内容上传至知识库进行结构化处理,供后续 LLM 查询。 相比于 AI 大模型内…

DevOps 平台选型对比:功能与价值剖析

在数字化转型加速的当下,高效的软件开发流程成为企业竞争力的关键。DevOps 平台作为整合开发与运维的重要工具,其选型至关重要。Gitee DevOps 是一款在行业内表现出色的平台,能为企业提供从代码管理到部署上线的全流程支持。通过对其功能、价格、用户体验等多方面与市场竞品…

关于如何搭建anythingllm+ollama(deepseekr1、嵌入模型)+milvus的本地知识库语言模型

这里只是对于自己在部署过程中踩到的坑做个记录。 以anythingllm为平台,接入基于ollama运行deepseekr1通用模型、嵌入模型,使用milvus作为向量数据库。其中milvus和anythingllm均在docker desktop中运行。 一、ollama 1.首先在ollama官网下载并安装ollama。 2.然后在官网的mo…

Endnote 修改了参考文献格式后,文献的引用有的上标,有的不是上标

如上图,有的文献引用是正常格式,有的文献引用的的方括号是上标的形式。解决如下: 打开Endnote,找到“编辑”---“输出样式”---“编辑XXXXXX”(XXXXXX表示你正在使用的参考文献格式)---“引用”---“模板”---“Citatian” 将方框中的“Bibliography Number”两边的方括号…

Explain查询Sql效率

Explain分析Sql性能 前言 在我们平时开发中,因为系统可能属于初级阶段,数据库的数据还不是很多,所以自我感觉写的Sql语句上运行起来速度还不错,殊不知,随着时间推移,数据量日益增多,系统的查询效率会在打折扣,所以,Sql性能调优手段还得了解一下下。 Explain是什么?有…

部署mall项目遇到的问题和解决方案

部署mall项目爬坑日记 原作者项目 环境:ubuntu20 docker容器相关的坑 发现容器打印的日志和当前时间有出入,相差了8小时,后面得知容器和宿主机的时区不同导致 !> 解决办法有如下几种:1.在刚开始创建容器的时候,docker run后面加上-v /etc/localtime:/etc/localtime:ro2…

高并发下如何保证幂等性

好文章怕丢失?码起来! 本文转载自原文 高并发下如何保证接口的幂等性? 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场…

考OCP认证要交哪些费用?

考OCP认证要交哪些费用? 考OCP认证,指的是Oracle数据库管理员中级认证 Oracle Certified Professional,这是Oracle非常有名的一个认证,对于个人帮助巨大。 OCP认证要交不少钱,些费用因考试版本、培训机构和地区差异而有所不同,以下是综合各渠道信息后的费用说明: 1. 考…