✅什么是国密算法?SM2_SM4_SM3有什么区别?

✅什么是国密算法?SM2_SM4_SM3有什么区别?

典型回答


国密算法SM系列算法)是中国国家密码管理局(SCA,State Cryptography Administration)制定的国产商用密码算法标准,广泛应用于金融、政务、电信等领域,主要用于数据加密、身份认证、电子签名等场景。

本文主要介绍的都是SM系列密码,SM代表商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。

SM国密算法主要包括以下几种:

国密对称加密算法:SM4

SM4 是中国制定的分组对称加密算法,用于数据加密和解密。采用128位密钥,分组长度128位(16字节),采用32轮迭代加密方式,安全性较高,适用于无线局域网标准(WAPI)、移动支付、金融行业等。

相比常见的AES加密算法,AES支持128/192/256位,SM4固定128位。AES-128和SM4的安全性相当,SM4更适合国产软硬件环境。


String content = "Hollistest中文";

// 随机生成密钥
SymmetricCrypto sm4 = SmUtil.sm4();

String encryptHex = sm4.encryptHex(content);
String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);

国密非对称加密算法:SM2

SM2 是基于椭圆曲线密码学(ECC, Elliptic Curve Cryptography)的公钥密码算法,是一种典型的非对称加密算法。场用于数据加密、数字签名和身份认证

SM2相比传统RSA算法更高效,密钥长度更短但安全性更高。SM2使用256位,RSA通常为2048/3072位(更长)。SM2签名和解密速度比RSA快,适用于资源受限设备(如移动终端)。SM2主要用于电子认证、数字签名、SSL/TLS安全传输等场景。

String text = "Hollis测试aaaa";

SM2 sm2 = SmUtil.sm2();
// 公钥加密,私钥解密
String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));

国密哈希算法:SM3


SM3 是中国自主研发的密码散列算法(Hash算法),类似于SHA-256。他同样更适合国产硬件环境,被广泛用于中国的电子政务、金融、可信计算等应用。

//结果为:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be
String digestHex = SmUtil.sm3("aaaaa");

国密密钥交换算法:SM9

SM9 是基于**身份密码学(IBE,Identity-Based Encryption)**的公钥密码算法。通过用户的身份信息(如邮箱、手机号)生成公钥,无需传统的CA证书体系,减少证书管理成本。适用于物联网(IoT)、云计算、区块链等场景。

对比

算法 类型 主要用途 主要特点
SM4 对称加密 数据加密、文件加密 128位密钥,AES级安全
SM2 非对称加密 数字签名、身份认证 ECC算法,密钥短但更安全
SM3 哈希算法 数据完整性校验 抗碰撞,类似SHA-256
SM9 密钥交换 身份密码学,去中心化 适用于IoT、云计算

由于国家对信息安全的高度重视,国密算法已成为国内各行业的标准安全协议,并被广泛应用于各类安全场景。

扩展知识

如何使用

Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。可以使用Hutool来简化国密算法的使用:https://doc.hutool.cn/pages/SmUtil/#%E4%BB%8B%E7%BB%8D

引入以下依赖后,就可以像前面的例子一样使用这些算法了。

<dependency>
  <groupId>org.bouncycastle</groupId>
  <artifactId>bcpkix-jdk18on</artifactId>
  <version>1.78.1</version>
</dependency>