国密加密算法简介

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 国密指国家密码局认定的国产密码算法,主要包括SM1、SM2、SM3、SM4等,并持续完善。SM1是对称加密算法,加密强度与AES相当,需加密芯片支持;SM2是非对称加密,基于ECC算法,签名和密钥生成速度优于RSA;SM3为杂凑算法,安全性高于MD5;SM4为对称加密算法,用于无线局域网标准。本文提供使用Java和SpringBoot实现SM2和SM4加密的示例代码及依赖配置。更多国密算法标准可参考国家密码局官网。

介绍

国密即国家密码局认定的国产密码算法。主要有 SM1、SM2、SM3、SM4几类,种类在不断完善和增长。

SM1

SM1 为对称加密,该算法的算法实现原理没有公开,他的加密强度和 AES 相当,需要调用加密芯片的接口进行使用。此算法为软硬一体,若需要使用此算法,需要特殊的计算机CPU芯片配合。

SM2

国密 SM2 为非对称加密,基于ECC算法实现,其签名速度和密钥生成速度均快于RSA算法。

JAVA实现SM2案例,新建SpringBoot应用程序,增加以下依赖

<!-- hutool -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.11</version>
</dependency>

<!-- 国密算法支持,hutool的国密工具类依赖此 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

新建测试类,增加以下方法


@GetMapping("/test")
public String test() {
    //明文
    String text = "我是一段测试aaaa";
    log.debug("content is :{}", text);
    //生成公私钥
    KeyPair pair = SecureUtil.generateKeyPair("SM2");
    byte[] privateKey = pair.getPrivate().getEncoded();
    byte[] publicKey = pair.getPublic().getEncoded();
    //根据公私钥初始化一个SM2对象
    SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
    // 公钥加密
    String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
    log.debug("encryptText with publicKey is :{}", encryptStr);
    //私钥解密
    String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
    log.debug("decryptText with privateKey is :{}", decryptStr);
    return "ok";
}

配置文件设置日志级别为debug

Image.png

SM3

SM3为杂凑算法,即摘要算法,是不可逆算法的一种,类似MD5,安全性比MD5还要高。

SM4

SM4为无线局域网标准的分组数据算法,为对称加密算法。

JAVA实现SM4案例,新建SpringBoot应用程序,增加以下依赖


<!-- hutool -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.11</version>
</dependency>

<!-- 国密算法支持,hutool的国密工具类依赖此 -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.68</version>
</dependency>

新建测试类,增加以下方法


@GetMapping("/sm4")
public String sm4() {
    String content = "test中文";
    log.debug("content is :{}", content);
    //密钥必须为16个字符。JAVA中字符占1字节,SM4要求密钥为 128  bit  , 即16字节。
    String key = "123456789-123456";
    log.debug("key is :{}", key);
    byte[] secretKey = key.getBytes(CharsetUtil.CHARSET_UTF_8);
    SM4 sm41 = new SM4(secretKey);
    String encryptHex = sm41.encryptHex(content, CharsetUtil.CHARSET_UTF_8);
    log.debug("encryptText is :{}", encryptHex);
    String decryptStr = sm41.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
    log.debug("decryptText is :{}", decryptStr);
    return "ok";
}

Image.png

引用

国家密码局标准规范查询网址:http://www.oscca.gov.cn/app-zxfw/zxfw/bzgfcx.jsp
http://www.wenwoha.com/blog_detail-6.html
bouncycastle介绍:https://www.liaoxuefeng.com/wiki/1252599548343744/1305362418368545
hutool对于国密的支持:https://www.hutool.cn/docs/#/crypto/%E5%9B%BD%E5%AF%86%E7%AE%97%E6%B3%95%E5%B7%A5%E5%85%B7-SmUtil?id=%e4%bb%8b%e7%bb%8d

目录
相关文章
|
4月前
|
存储 算法 安全
【加密算法】AES对称加密算法简介
【加密算法】AES对称加密算法简介
|
4月前
|
机器学习/深度学习 算法 安全
【加密算法】RSA非对称加密算法简介
【加密算法】RSA非对称加密算法简介
|
4月前
|
机器学习/深度学习 算法 TensorFlow
机器学习算法简介:从线性回归到深度学习
【5月更文挑战第30天】本文概述了6种基本机器学习算法:线性回归、逻辑回归、决策树、支持向量机、随机森林和深度学习。通过Python示例代码展示了如何使用Scikit-learn、statsmodels、TensorFlow库进行实现。这些算法在不同场景下各有优势,如线性回归处理连续值,逻辑回归用于二分类,决策树适用于规则提取,支持向量机最大化类别间隔,随机森林集成多个决策树提升性能,而深度学习利用神经网络解决复杂模式识别问题。理解并选择合适算法对提升模型效果至关重要。
222 4
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
算法金 | 秒懂 AI - 深度学习五大模型:RNN、CNN、Transformer、BERT、GPT 简介
**RNN**,1986年提出,用于序列数据,如语言模型和语音识别,但原始模型有梯度消失问题。**LSTM**和**GRU**通过门控解决了此问题。 **CNN**,1989年引入,擅长图像处理,卷积层和池化层提取特征,经典应用包括图像分类和物体检测,如LeNet-5。 **Transformer**,2017年由Google推出,自注意力机制实现并行计算,优化了NLP效率,如机器翻译。 **BERT**,2018年Google的双向预训练模型,通过掩码语言模型改进上下文理解,适用于问答和文本分类。
121 9
|
1月前
|
算法
【算法】贪心算法简介
【算法】贪心算法简介
|
1月前
|
算法
【算法】递归、搜索与回溯——简介
【算法】递归、搜索与回溯——简介
|
2月前
|
算法
Raid5数据恢复—Raid5算法简介&raid5磁盘阵列数据恢复案例
Raid5算法也被称为“异或运算”。异或是一个数学运算符,它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。异或的运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)。如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。 异或也叫半加运算,其运算法则相当于不带进位的二进制加法。二进制下用1表示真,0表示假。异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。 异或略称为XOR、EOR、EX-OR,程序中有三种演算子:XOR、xor、⊕。使用方法如下z = x ⊕ y z
Raid5数据恢复—Raid5算法简介&raid5磁盘阵列数据恢复案例
|
4月前
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
4月前
|
算法 关系型数据库 C语言
卡尔曼滤波简介+ 算法实现代码(转)
卡尔曼滤波简介+ 算法实现代码(转)
66 4
|
4月前
|
机器学习/深度学习 自然语言处理 算法
深度学习算法简介(二)
深度学习算法简介(二)