国密即国家密码局认定的国产密码算法,主要有 SM1、SM2、SM3、SM4、SM7、SM9。
国密算法分类
国家标准官方网站:http://openstd.samr.gov.cn/bzgk/gb/
- SM1 为对称加密,其加密强度与 AES 相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用
- SM2 非对称加密,基于 ECC。该算法已公开。由于该算法基于 ECC,故其签名速度与秘钥生成速度都快于 RSA。ECC 256 位(SM2 采用的就是 ECC 256 位的一种)安全强度比 RSA 2048 位高,但运算速度快于 RSA
- SM3 消息摘要,可以用 MD5 作为对比理解。该算法已公开,校验结果为 256 位
- SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为 128 位
- SM7 是一种分组密码算法,分组长度为 128 比特,密钥长度为 128 比特。SM7 适用于非接触式 IC 卡,应用包括身份识别类应用(门禁卡、工作证、参赛证)、票务类应用(大型赛事门票、展会门票)、支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)
- SM9 不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。这些安全应用可采用手机号码或邮件地址作为公钥,实现数据加密、身份认证、通话加密、通道加密等安全应用,并具有使用方便、易于部署的特点,从而开启了普及密码算法的大门
| 算法 | 类型 | 长度 | 是否公开 | 典型应用 |
|---|---|---|---|---|
| SM1 | 对称加密 | 强度与 AES 相当 | 不公开,通过加密芯片接口调用 | 加密芯片 |
| SM2 | 非对称加密(基于 ECC) | ECC 256 位 | 已公开 | 数字签名、密钥协商、数据加密 |
| SM3 | 消息摘要 | 杂凑值 256 比特 | 已公开 | 数字签名、消息认证码、随机数生成 |
| SM4 | 对称分组加密 | 密钥/分组均 128 位 | 已公开 | 无线局域网产品 |
| SM7 | 分组密码 | 分组/密钥均 128 比特 | —— | 非接触式 IC 卡 |
| SM9 | 标识密码 | —— | —— | 手机号/邮件地址作为公钥的互联网应用 |
SM2 算法
SM2 椭圆曲线公钥密码算法是我国自主设计的公钥密码算法,包括 SM2-1 椭圆曲线数字签名算法、SM2-2 椭圆曲线密钥交换协议、SM2-3 椭圆曲线公钥加密算法,分别用于实现数字签名、密钥协商和数据加密等功能。SM2 算法与 RSA 算法不同的是,SM2 算法是基于椭圆曲线上点群离散对数难题,相对于 RSA 算法,256 位的 SM2 密码强度已经比 2048 位的 RSA 密码强度要高。
SM2 公钥加密算法比 RSA 相对复杂,加密结果由 3 个部分组成。SM2 加密过程中使用了随机数,因此同样的明文数据每一次加密结果都不一样。但是这并不能防御重放攻击,如果要防御重放攻击,需要服务端提供加密因子,通过 SM2+SM4 混合算法来抵御重放攻击。
先学习 ECC 算法
学习 SM2 算法,首先学习 ECC 算法。ECC 算法描述:
- 用户 A 选定一条适合加密的椭圆曲线 Ep(a,b)(如 y² = x³ + ax + b),并取椭圆曲线上一点,作为基点 G
- 用户 A 选择一个私有密钥 k,并生成公开密钥(公钥)K = kG
- 用户 A 将 Ep(a,b) 和点(公钥)K、G 传给用户 B
- 用户 B 接到信息后,将待传输的明文编码到 Ep(a,b) 上一点 M,并产生一个随机整数 r(r < n),加密开始
- 用户 B 计算点 C1 = M + rK;C2 = rG
- 用户 B 将 C1、C2 传给用户 A
- 用户 A 接到信息后,计算 C1 - kC2,结果就是点 M。因为 C1 - kC2 = M + rK - k(rG) = M + rK - r(kG) = M;再对点 M 进行解码就可以得到明文
sequenceDiagram
participant A as 用户A
participant B as 用户B
A->>A: 选定椭圆曲线 Ep(a,b) 与基点 G
A->>A: 选私钥 k,生成公钥 K=kG
A->>B: 传送 Ep(a,b)、公钥 K、基点 G
B->>B: 明文编码为曲线上一点 M,产生随机数 r<n
B->>B: 计算 C1=M+rK,C2=rG
B->>A: 传送 C1、C2
A->>A: 计算 C1-kC2 = M,解码得到明文
密码学中,描述一条 Fp 上的椭圆曲线,常用到六个参量:T=(p,a,b,G,n,h)。(p、a、b 用来确定一条椭圆曲线,G 为基点,n 为点 G 的阶,h 是椭圆曲线上所有点的个数 m 与 n 相除的整数部分。)这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:
- p 当然越大越安全,但越大,计算速度会变慢,200 位左右可以满足一般安全要求
- p ≠ n×h
- p^t ≠ 1 (mod n),1≤t<20
- 4a³+27b² ≠ 0 (mod p)
- n 为素数
- h ≤ 4
(原文此处配有 SM2 算法流程图和 SM2 与 RSA 安全性对比图,图片已丢失。)
SM2 标准与算法结构
SM2 算法就是 ECC 椭圆曲线密码机制,但在签名、密钥交换方面不同于 ECDSA、ECDH 等国际标准,而是采取了更为安全的机制。另外,SM2 推荐了一条 256 位的曲线作为标准曲线。
SM2 标准包括总则、数字签名算法、密钥交换协议、公钥加密算法四个部分,并在每个部分的附录详细说明了实现的相关细节及示例。
SM2 算法主要考虑素域 Fp 和 F2m 上的椭圆曲线,分别介绍了这两类域的表示、运算,以及域上的椭圆曲线的点的表示、运算和多倍点计算算法。然后介绍了编程语言中的数据转换,包括整数和字节串、字节串和比特串、域元素和比特串、域元素和整数、点和字节串之间的数据转换规则。
详细说明了有限域上椭圆曲线的参数生成以及验证,椭圆曲线的参数包括有限域的选取、椭圆曲线方程参数、椭圆曲线群基点的选取等,并给出了选取的标准以便于验证。最后给椭圆曲线上密钥对的生成以及公钥的验证,用户的密钥对为(s,sP),其中 s 为用户的私钥,sP 为用户的公钥,由于离散对数问题从 sP 难以得到 s。总则中的知识也适用于 SM9 算法。
在总则的基础上给出了数字签名算法(包括数字签名生成算法和验证算法)、密钥交换协议以及公钥加密算法(包括加密算法和解密算法),并在每个部分给出了算法描述、算法流程和相关示例。
数字签名算法、密钥交换协议以及公钥加密算法都使用了国家密管理局批准的 SM3 密码杂凑算法和随机数发生器。数字签名算法、密钥交换协议以及公钥加密算法根据总则来选取有限域和椭圆曲线,并生成密钥对。
SM2 算法在很多方面都优于 RSA 算法(RSA 发展得早应用普遍,SM2 领先也很自然)。
SM3 算法
SM3 杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如 MD5 输出 128 比特杂凑值,输出长度太短,影响其安全性;SHA-1 算法的输出长度为 160 比特,SM3 算法的输出长度为 256 比特,因此 SM3 算法的安全性要高于 MD5 算法和 SHA-1 算法。
对长度为 l(l < 2^64)比特的消息 m,SM3 杂凑算法经过填充和迭代压缩,生成杂凑值,杂凑值长度为 256 比特。
假设消息 m 的长度为 l 比特,首先将比特”1”添加到消息的末尾,再添加 k 个”0”,k 是满足 l + 1 + k ≡ 448 (mod 512) 的最小的非负整数;然后再添加一个 64 位比特串,该比特串是长度 l 的二进制表示。填充后的消息 m′ 的比特长度为 512 的倍数。
例如:对消息 01100001 01100010 01100011,其长度 l = 24,经填充得到比特串:
01100001 01100010 01100011 1 00...00(423比特)00...011000(64比特l的二进制表示)
(原文此处配有 SM3 标准输出的示例图,图片已丢失。)
SM4 算法
此算法是一个分组算法,用于无线局域网产品。该算法的分组长度为 128 比特,密钥长度为 128 比特。加密算法与密钥扩展算法都采用 32 轮非线性迭代结构。解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。
此算法采用非线性迭代结构,每次迭代由一个轮函数给出,其中轮函数由一个非线性变换和线性变换复合而成,非线性变换由 S 盒所给出。其中 rki 为轮密钥,合成置换 T 组成轮函数。轮密钥的产生与加密流程类似,由加密密钥作为输入生成,轮函数中的线性变换不同,还有些参数的区别。
过程:
- 基本运算:SM4 密码算法使用模 2 加和循环移位作为基本运算
- 基本密码部件:SM4 密码算法使用了 S 盒、非线性变换 τ、线性变换部件 L、合成变换 T 基本密码部件
- 轮函数:SM4 密码算法采用对基本轮函数进行迭代的结构。利用上述基本密码部件,便可构成轮函数。SM4 密码算法的轮函数是一种以字为处理单位的密码函数
- 加密算法:SM4 密码算法是一个分组算法。数据分组长度为 128 比特,密钥长度为 128 比特。加密算法采用 32 轮迭代结构,每轮使用一个轮密钥
- 解密算法:SM4 密码算法是对合运算,因此解密算法与加密算法的结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序
- 密钥扩展算法:SM4 密码算法使用 128 位的加密密钥,并采用 32 轮迭代加密结构,每一轮加密使用一个 32 位的轮密钥,共使用 32 个轮密钥。因此需要使用密钥扩展算法,从加密密钥产生出 32 个轮密钥
- SM4 的安全性:SM4 密码算法经过我国专业密码机构的充分分析测试,可以抵抗差分攻击、线性攻击等现有攻击,因此是安全的
(原文此处配有 SM4 实例图,图片已丢失。)
SM7 算法
SM7 算法是一种分组密码算法,分组长度为 128 比特,密钥长度为 128 比特。SM7 适用于非接触式 IC 卡,应用包括身份识别类应用(门禁卡、工作证、参赛证)、票务类应用(大型赛事门票、展会门票)、支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通等)。
SM9 算法
为了降低公开密钥系统中密钥和证书管理的复杂性,以色列科学家、RSA 算法发明人之一 Adi Shamir 在 1984 年提出了标识密码(Identity-Based Cryptography)的理念。标识密码将用户的标识(如邮件地址、手机号码、QQ 号码等)作为公钥,省略了交换数字证书和公钥过程,使得安全系统变得易于部署和管理,非常适合端对端离线安全通讯、云端数据加密、基于属性加密、基于策略加密的各种场合。2008 年标识密码算法正式获得国家密码管理局颁发的商密算法型号:SM9(商密九号算法),为我国标识密码技术的应用奠定了坚实的基础。
SM9 算法不需要申请数字证书,适用于互联网应用的各种新兴应用的安全保障。如基于云技术的密码服务、电子邮件安全、智能终端保护、物联网安全、云存储安全等等。这些安全应用可采用手机号码或邮件地址作为公钥,实现数据加密、身份认证、通话加密、通道加密等安全应用,并具有使用方便、易于部署的特点,从而开启了普及密码算法的大门。
相关工具
GmSSL
GmSSL 是一个开源的密码工具箱,支持 SM2/SM3/SM4/SM9 等国密(国家商用密码)算法、SM2 国密数字证书及基于 SM2 证书的 SSL/TLS 安全通信协议,支持国密硬件密码设备,提供符合国密规范的编程接口与命令行工具,可以用于构建 PKI/CA、安全通信、数据加密等符合国密标准的安全应用。
GmSSL 项目是 OpenSSL 项目的分支,并与 OpenSSL 保持接口兼容。因此 GmSSL 可以替代应用中的 OpenSSL 组件,并使应用自动具备基于国密的安全能力。GmSSL 项目采用对商业应用友好的类 BSD 开源许可证,开源且可以用于闭源的商业应用。
GmSSL 项目由北京大学关志副研究员的密码学研究组开发维护,项目源码托管于 GitHub。自 2014 年发布以来,GmSSL 已经在多个项目和产品中获得部署与应用,并获得 2015 年度”一铭杯”中国 Linux 软件大赛二等奖(年度最高奖项)与开源中国密码类推荐项目。GmSSL 项目的核心目标是通过开源的密码技术推动国内网络空间安全建设。
参考文章
- 《科普一下 SM 系列国密算法(从零开始学区块链)》
- https://blog.csdn.net/qq_33430322/article/details/106687662
系列导航
- 上一篇:开发安全 009:摘要算法
- 下一篇:开发安全 011:Web 安全测试平台 DVWA
- 相关阅读:加密算法(SM2/SM4 与 RSA/DES 对应) · 摘要算法(SM3 与 MD5/SHA-1 对应)