Skip to content

面试速答(先看这里)

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

60秒标准回答:

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

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

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

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **国密对称加密算法:SM4:**SM4 是中国制定的 分组对称加密算法 ,用于数据加密和解密。
  • **国密非对称加密算法:SM2:**SM2 是基于椭圆曲线密码学(ECC, Elliptic Curve Cryptography)的 公钥密码算法 ,是一种典型的非对称加密算法。
  • **国密哈希算法:SM3:**SM3 是中国自主研发的 密码散列算法(Hash算法) ,类似于SHA-256。
  • **国密密钥交换算法:SM9:**SM9 是基于 身份密码学(IBE,Identity-Based Encryption) 的公钥密码算法。

**记忆锚点:**SM2 → SM4 → SM3 → 国密算法 → SM9 → AES

关键取舍:

  • 采用128位密钥,分组长度128位(16字节),采用32轮迭代加密方式,安全性较高,适用于无线局域网标准(WAPI)、移动支付、金融行业等。
  • SM2签名和解密速度比RSA快,适用于资源受限设备(如移动终端)。
  • 适用于物联网(IoT)、云计算、区块链等场景。

加分表达:

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

追问准备:

  • 围绕「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更适合国产软硬件环境。

java
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安全传输等场景。

java
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。他同样更适合国产硬件环境,被广泛用于中国的电子政务、金融、可信计算等应用。

java
//结果为: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

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

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