概叙
科普文:Java基础系列之【java加密/解密、签名之国密SM:SM1(SCB2)、SM2、SM3、SM4、SM7、SM9,ZUC】_sm1解密-CSDN博客
实战:Java基础系列之【国密SM:SM2、SM3、SM4的java实现bcprov-jdk】_java 国密-CSDN博客
实战:架构设计之支付系统设计【身份证号、银行卡号、地址、姓名、手机号如何存储?】_gdpr保护原则下身份证号 手机号应该如何存储-CSDN博客
科普文:Java基础系列之【java加密/解密、签名】_java公钥加密私钥解密-CSDN博客
国密即国家密码局认定的国产密码算法,即商用密码。
商用密码,是指能够实现商用密码算法的加密、解密和认证等功能的技术。(包括密码算法编程技术和密码算法芯片、加密卡等的实现技术)。
国密算法,即国家商用密码算法,是由 国家密码管理局 认定和公布的密码算法标准及其应用规范,其中部分密码算法已经称为国际标准。
国家密码局的密码标准列表 http://www.gmbz.org.cn/main/bzlb.html,此列表中可以找到一系列国密算法标准文档。
科普文:【支持信创、宣传国产】国密SM之对称加密SM1详解-CSDN博客
科普文:【支持信创、宣传国产】国密SM之非对称加密SM2详解-CSDN博客
科普文:【支持信创、宣传国产】国密SM之签名算法SM3详解-CSDN博客
科普文:【支持信创、宣传国产】国密SM之对称加密算法SM4详解-CSDN博客
科普文:【支持信创、宣传国产】国密SM之对称加密算法SM7详解-CSDN博客
科普文:【支持信创、宣传国产】国密SM之对称加密算法ZUC祖冲之算法详解-CSDN博客
如:SM系列 密码,SM 代表 商密,即商业密码,是指用于商业的、不涉及国家秘密的密码技术。
- SM1、SM4、SM7、祖冲之密码(ZUC)属于对称算法;
- 备注:SM1、SM7算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
- SM2、SM9属于非对称算法;
- SM3属于哈希算法。
国密SM之非对称加密SM9详解
一、SM9简介
SM9是中国国家密码管理局发布的标识密码算法(IBC),无需证书即可实现身份认证与密钥交换。支持数字签名、密钥交换、加密三大功能,密钥长度128位(实际安全强度约128位)。
- 性质:中国国家密码管理局发布的标识密码算法(IBE,Identity-Based Encryption),基于双线性对(Bilinear Pairing),属于非对称加密体系。
- 核心标准:GB/T 38635-2020
- 核心功能:
- 数字签名
- 密钥交换
- 数据加密
- 关键参数:
- 椭圆曲线:
sm9p256v1
- 主密钥:系统级秘密参数(由KGC生成)
- 用户密钥:通过用户标识符(如邮箱/手机号)派生
- 椭圆曲线:
SM9是中国发布的标识密码算法,基于椭圆曲线实现,支持无证书的标识加密,适用于云计算、物联网等场景。
二、核心原理与流程
SM9算法是一种基于身份的标识密码算法,它采用了双线性对等数学工具,实现了基于用户身份标识的加密和签名机制。这种算法的核心在于将用户的身份标识(如邮箱地址、手机号码等)直接作为公钥,从而简化了密钥管理过程。
1. 基本特性:
- 基于双线性配对(Pairing-based Cryptography)
- 无需CA证书,直接绑定用户身份与密钥
- 主要参数:椭圆曲线参数、主密钥、系统参数
2. 核心流程:
- 系统初始化:密钥生成中心(KGC)生成系统参数,包括椭圆曲线参数、哈希函数、双线性对等参数以及主私钥和主公钥。
- 用户密钥生成:用户向KGC提交自己的身份标识信息,KGC使用主私钥和用户的标识信息生成用户的私钥,并通过安全通道发送给用户。同时,KGC使用主公钥和用户的标识信息生成用户的公钥,并将其公开。
- 签名与验签:当用户需要签名时,使用自己的私钥对消息进行签名;接收方使用发送方的公钥对签名进行验证,以确保消息的来源可靠性和完整性。
- 密钥协商:两个用户需要协商共享密钥时,各自使用对方标识和自己的私钥进行计算,最终得到相同的会话密钥。
系统初始化:
1. 选择椭圆曲线(如SM9推荐曲线)
2. 生成主密钥(128位随机数)
3. 计算系统参数(包括配对相关参数)
密钥生成:
1. 用户提交身份标识(如邮箱、手机号)
2. KGC(密钥生成中心)计算用户私钥:SK = d * Ppub + H1(ID)
3. 返回私钥给用户(需安全通道)
加密/解密:
- 加密:
C = (e(Ppub, H1(ID))^k, M ⊕ H2(e(SK, Q)))
- 解密:
M = (C1)^SK ⊕ H2(e(SK, Q))
签名/验签:
- 签名:
σ = (r, s) = (H1(M) + x, r - x * d)
- 验签:验证
e(Ppub, σ1) * e(H1(ID), σ2) = e(P1, P2)^H(M)
三、优缺点分析
优点 | 缺点 |
---|---|
无需证书管理(简化PKI体系) | 依赖KGC(存在密钥托管风险) |
高效的身份认证(单次通信完成) | 双线性配对计算开销较大 |
支持大规模用户(百万级标识) | 标准化程度较SM2/SM3低 |
优点:
- 高效性:SM9算法在相同安全强度下具有更短的密钥长度,提高了加密和解密的效率。
- 简化密钥管理:将用户身份标识作为公钥,省去了传统非对称加密算法中单独生成、分发和管理公钥和私钥对的繁琐过程。
- 高安全性:基于椭圆曲线离散对数问题的困难性,SM9算法能够有效抵御各种密码分析攻击。
缺点:
- 对标识管理系统的依赖:SM9算法需要依赖标识管理系统来生成和管理用户的身份标识和公钥。
- 主密钥安全性风险:若密钥生成中心被攻破,整个体系将失效。因此,主密钥的安全性是SM9算法的一个潜在风险点。
四、典型应用场景
SM9算法通过标识即公钥的创新设计,解决了传统PKI体系的证书管理难题,尤其适合:
- 大规模用户系统(如电子政务)
- 固定身份场景(物联网设备)
- 隐私保护需求(医疗/金融数据)
- 政务云:跨部门敏感数据加密(公钥=公务员编号)
- 物联网:设备身份认证(公钥=设备序列号)
- 医疗数据:患者病历加密(公钥=身份证号)
- 区块链:去中心化身份(DID)解决方案
实际开发中需注意:
- KGC必须部署在安全可信环境中
- 敏感操作建议通过国密认证HSM实现
- 结合SM3/SM4构建完整国密技术栈
SM9算法在信息安全领域有着广泛的应用场景,包括:
- 电子政务:用于政府内部文件传输、电子证照系统等的身份认证和数据加密。
- 电子商务:在电商平台中保护用户数据的安全传输和交易双方的身份认证。
- 物联网:在物联网设备中用于设备间的身份认证和密钥协商。
- 移动支付:确保支付过程中的数据安全和用户身份的真实性。
注意事项
- 标识的唯一性管理:在实际部署时,需要确保用户标识的唯一性,避免不同用户使用相同标识导致的安全问题。
- 主密钥的安全性:主密钥通常采用门限机制存储,分割成多个片段由不同机构保管,以确保其安全性。
- 算法实现的优化:在算法实现时,需要关注椭圆曲线运算的优化,特别是双线性对的计算效率,以提高加密和解密的性能。
- 硬件加速模块的使用:在移动端部署时,建议使用硬件加速模块处理核心运算,以提高算法的执行效率。
五、Java开发注意事项
1. 必须使用支持SM9的库:
- 推荐:GMSSL(国密SSL库)
- 或BouncyCastle(需手动实现部分功能)
2. 依赖配置:
<!-- 无纯Java实现库,需以下方式之一 --> <!-- 方案1:厂商SDK(如华大电子HCNetSDK) --> <!-- 方案2:PKCS#11接口调用加密机 -->
3. 注意事项:
- Java标准库不包含SM9实现
- 需自行实现或依赖厂商库(如卫士通、江南天安)
4. 生产环境建议
KGC部署:
- 主密钥必须使用HSM保护
- 建议采用门限方案(如3/5门限)分散主密钥
性能优化:
- 对批量加密使用线程池
- 考虑预计算双线性配对结果
标准合规:
- 必须符合《GM/T 0024-2014 SM9标识密码算法》
- 定期进行安全审计
六、Java示例代码
SM9算法在Spring Boot项目中的集成要点:
1. 必须依赖KGC基础设施
2. 生产环境必须使用硬件保护主密钥
3. 适合身份认证密集型场景
4. 严格遵守《GM/T 0024-2014》标准
(完整实现需部署KGC服务端,本示例仅展示客户端调用逻辑。实际商用需联系密码厂商如卫士通、江南天安获取完整解决方案)
常见问题解决
1. 库兼容性问题:
- 确认GMSSL版本支持SM9(建议≥1.1.0)
- 检查JVM是否为64位版本(SM9计算需要大内存)
2. 性能瓶颈:
- 双线性配对计算耗时较高(约10-100ms/次)
- 建议缓存常用用户的配对结果
3. 跨平台问题:
- 确保所有节点使用相同曲线参数
- 注意字节序一致性(SM9默认大端序)