摘要:本文档对GM/T 0130—2023《基于SM2 算法的无证书及隐式证书公钥机制》(征求意见稿)描述的无证书密码系统进行记录和分析。
关键词:无证书,隐式证书,公钥,证书,签名,验签,SM2
1. 无证书系统概况
1.1 概况
非对称密码系统中需要解决如何安全地将用户身份和用户公钥对应起来的问题。目前主流解法有如下三种。
解法一:采用公钥基础设施(PublicKey Infrastructure,PKI)技术实现数字证书机制,安全地将用户身份和用户密钥绑定在一起。用户在业务系统中需要先交换证书,然后使用公私钥完成身份认证、访问控制、数据安全传输等操作,相关过程较复杂。
解法二:使用基于标识的密码技术(Identity-Based Cryptography,IBC)。在基于标识的密码系统中,用户的标识可以作为用户的公钥,解决公钥真实性的同时简化密钥管理复杂性。这些标识可以是邮件地址、手机号码、身份证号码等,也可以是设备标识等。用户的私钥由密钥生成中心(key generation center,KGC)生成,这使得该系统具有密钥托管属性。
解法三:无证书的密码体制。介于PKI和标识密码之间,用户私钥由用户和密钥生成中心共同决定,所以没有密钥托管功能。典型代表有1991年Girault提出的隐式证书密码系统(Implicit Certificate)和Al-Riyami和Paterson在2001年提出的无证书公钥密码体制(AP-CL-PKC)。这类系统特点是无证书管理、系统轻量、通信开销低等。2023年12月国家密码管理局在第45号公告[1]中发布了自2024年6月1日起实施的GM/T 0130—2023《基于SM2算法的无证书及隐式证书公钥机制》等25项密码行业标准。
下文对GM/T 0130—2023《基于SM2算法的无证书及隐式证书公钥机制》(送审稿)进行粗略的系统执行流程分析以及工程实现解析。
整体而言,GM/T 0130—2023整个无证书密码系统基于SM2实现,提供加密、解密、签名、验签功能。
1.2 角色组成
在此系统中涉及两个角色,KGC(密钥生成中心)和普通用户。
- KGC:密钥生成中心,类似CA;KGC和用户一起共同生成用户密钥对(就是SM2密钥对)
- 用户:普通的用户,执行加密、解密、签名、验签功能。
表1-1 两类角色在各密码功能中的参情况
功能 |
KGC |
普通用户 |
主密钥生成 |
√ |
× |
用户密钥生成 |
√ 参与 |
√ 参与 |
加密 |
× |
√ |
解密 |
× |
√ |
签名 |
× |
√ |
验签 |
× |
√ |
1.3 密码功能
- 密钥生成与校验:
- 主密钥对生成:KGC独立完成
- 用户密钥对的生成与校验:KGC和用户一起生成(部分由用户控制、部分由KGC控制,有点像密钥分割)
- 签名:几乎是标准的SM2签名。
- 验签:先用签名者的公钥半成品(声明公钥)推出真正的公钥,然后用公钥执行标准的SM2验签。
- 加密:先用解密者的公钥半成品(声明公钥)推出真正的公钥,然后用公钥执行标准的SM2加密。
- 解密:就是SM2解密。
表1-2 无证书功能概况
功能 |
无证书系统 |
主密钥生成 |
KGC生成 (SM2无) |
用户密钥生成 |
部分由用户控制、部分由KGC控制 (SM2由用户自己生成) |
签名 |
≈ SM2签名 |
验签 |
先用签名者声明公钥推出真正的公钥, 再执行SM2验签。 |
加密 |
先用解密者声明公钥推出真正公钥, 再执行SM2加密 |
解密 |
= SM2解密 |
图1-X 无证书密码功能
1.4 专利
标准的引言部分列出了专利提醒—— “声明符合本文件时,可能涉及到与6、7相关的ZL 2017 10792638.7”,其中的“6、7”分别表示标准GM/T 0130—2023的第6章“密钥生成机制及流程”和第7章“数字签名机制”。专利ZL 2017 10792638.7[2]的申请日为2017年09月05日,于2020年07月14日获得专利授权。
2. 密钥生成
2.1 密钥生成概况
2.1.1 密钥生成概况表和概要流程图
密钥生成的概况如下表所示,也可参见下图。
表2-1 密钥生成概况(参见图2-1)
序 |
执行模块 |
执行主体 |
功能说明 |
1 |
生成主公私钥 |
KGC执行 |
给定安全参数k,初始化无证书密码系统,生成系统主公钥和主私钥。 |
2 |
生成用户密钥(1)——生成部分用户公私钥对 |
用户执行 |
生成用户部分公钥和部分私钥(dA`, UA)。 |
3 |
生成用户密钥(2)——生成用户声明公钥 |
KGC执行 |
为用户生成部分私钥tA和声明公钥WA。 |
4 |
生成用户密钥(3)——生成用户私钥 |
用户执行 |
生成用户的完整私钥dA。 |
5 |
生成公钥/校验公钥(从声明公钥) |
任何人 |
从声明公钥等公开信息计算得到 |
注:在此系统中,用户的声明公钥很重要:
- 声明公钥和用户ID等信息一起可以派生出用户的真正公钥。
- 用户可以通过两种方式验证声明公钥的正确性,比较方法1(私钥计算公钥)和方法2(声明公钥和用户ID计算公钥)计算结果的一致性,详情见2.1.5 生成用户密钥对——用户自己验证公钥。
- 如果声明公钥和伪造的用户ID一起计算用户公钥,则计算出来的用户公钥和真正的用户私钥不匹配,这使得伪造者和真正用户都会解密失败;同理,验签也不能通过。
- 系统中通常交换的是用户声明公钥而不是用户的真正公钥。做加密、验签时,临时从用户声明公钥计算出用户真正公钥。
图中部分记号见2.1.2节和2.1.3节,完整记号参见标准。
用户密钥生成算法描述如下图,其中用户公私钥记号如下:
- dA:用户私钥,
- PA:用户公钥,
- PA是声明公钥,可认为是公钥半成品。在隐式证书密码系统中也称为公钥还原数据。
图2-1 密钥生成
2.1.2 生成主密钥对——生成主私钥ms和主公钥PPUB
类似SM2的密钥对生成
- ms:主私钥,随机
- PPUB:主公钥,PPUB = [ms]G,G是SM2的基点
2.1.3 生成用户密钥对——生成用户私钥dA和用户声明公钥WA
用户密钥生成算法中用户公私钥等记号如下:
- IDA:用户标识
- dA:用户私钥,
- PA:用户公钥,
- WA:声明公钥,用它和标识等信息计算出用户公钥PA。在隐式证书密码系统中也称为公钥还原数据。
用户私钥dA和用户声明公钥WA的生成流程如下(执行流程图回顾图2-1)。
表2-2 用户密钥对生成流程(三段式,用户+KGC协同)
阶段 |
KGC |
传输数据 |
用户A |
第1阶段 |
标识IDA和UA <—————— |
A1:随机dA`; A2:UA = [dA`]G | |
第2阶段 |
K1:HA = H256(…); K2:随机w; K3:WA = [w]G + UA; K4:λ = H256(xWA || yWA || HA) mod n K5:tA = (w + λ*ms) mod n |
tA和声明公钥WA ——————> | |
第3阶段 |
A3:私钥dA = (tA + dA`) mod n; A4:输出(dA, WA)。 (要求0<dA<n-1) |
注:HA = H256( ENTLA || IDA || a || b || xG || yG || xPub || yPub);
2.1.4 生成用户密钥对——生成用户公钥PA
生成用户公钥,有如下两种方式:
- 方式1:由私钥生成,PA=[dA]G,即SM2密钥对生成。仅用户自己可以。
- 方式2:由声明公钥、用户标识等生成。任何人都可以。执行流程如下(如下图)。
步骤1. HA = H256( ENTLA || IDA || a || b || xG || yG || xPub || yPub)
步骤2. λ=H256(xWA || yWA || HA) mod n
步骤3. PA=WA+[λ]Ppub
图2-2 用户公钥生成流程图
(由用户声明公钥、用户标识等生成)
2.1.5 生成用户密钥对——用户自己验证公钥
用户自己采用两种方式(方式1和方式2)计算公钥。
对比两个公钥是否一致,一致则验证通过。
2.2 用户密钥对的梳理
1)用户公私钥可看做三个碎片拼接而成
根据用户公私钥计算流程,可以将它们看做如下三个碎片拼接而成(如下表)。
表2-3 公私钥的三个碎片
注:根据λ计算流程,λ内含用户ID信息。
2)用户私钥组成
组成用户私钥的三个碎片如下图所示。
3)用户公钥组成
组成用户公钥的三个碎片如下图所示。
3. 无证书签名
表3-1 无证书签名算法与标准SM2签名算法的对比
SM2无证书签名算法 |
标准SM2签名算法 | |
ZA值 |
ZA = HA = H256(ENTLA || IDA || a || b || xG || yG || xPUB || yPUB )【改】 (xPUB, yPUB)为系统主公钥 |
ZA = H256(ENTLA || IDA || a || b || xG || yG || xA || yA ). (xA, yA)为A的公钥PA |
消息M |
M=xWA|| yWA || m【改】 (xWA, yWA)是A的声明公钥 |
M=m |
私钥dA |
不变 |
不变 |
输出 |
签名值(r, s) |
签名值(r, s) |
步骤 |
(使用修订的ZA、M,步骤同SM2签名) |
(标准SM2签名算法步骤如下所示) |
2.1 M* = ZA || M = ZA||xWA||yWA ||m 2.2 e = H256(M*) = H256(ZA || xWA|| yWA || m) 2.3 同右 2.4 同右 2.5 同右 2.6 同右 2.7 同右 |
2.1 M* = ZA || M 2.2 e = H256(M*) = H256(ZA || m) 2.3 k ∈R Zq* 2.4 (x1, y1) = [k]G 2.5 r = (e + x1) mod n 2.6 s = (k-r*dA) / (dA + 1) mod n 2.7 输出(u, v) |
★无证书签名与SM2标准签名算法的差异:
- 计算ZA,无证书签名的最后两个参数不是A的公钥信息,而是主公钥。
- 一方面,从恢复公钥的角度看,公钥需要λ值,λ需要Z值,Z值需要公钥。所以被迫将Z值计算所需的公钥信息替换为主公钥。
- 另一方面,这里替换为KGC的主公钥了,就必须在其它地方嵌入签名者公钥信息,所以就在e值中嵌入了公钥半成品
- 计算e值:参与杂凑的参数实际上增加了用户A的声明WA(个人认为此处替换为公钥OA也行)。
其它步骤与SM2签名相同。
签名流程对比如下图(无证书签名 VS 标准的SM2签名)。
图3-1 签名流程对比
(无证书签名 VS 标准SM2签名)
4. 无证书验签
表4-1 无证书验签算法与标准SM2验签算法的对比
SM2无证书验签算法 |
标准SM2验签算法 | |
输入 ZA值 |
ZA = HA = H256(ENTLA || IDA || a || b || xG || yG || xPUB || yPUB )【改】 (xPUB, yPUB)为系统主公钥 |
ZA = H256(ENTLA || IDA || a || b || xG || yG || xA || yA ). (xA, yA)为A的公钥 |
输入 消息M |
M = xWA|| yWA || m【改】 (xWA, yWA)是A的声明公钥 |
M = m |
输入 公钥PA |
用声明公钥WA=( xWA|| yWA)计算 1) λ= H256(xWA|| yWA || HA) 2) PA = WA + [λ]PPUB. |
PA |
输出 |
验签通过/不通过 |
验签通过/不通过 |
步骤 |
(使用修订的ZA、M,及计算得到的公钥PA,步骤同SM2验签) |
(标准SM2验签算法步骤如下所示) |
1 同右 2 同右 3 M* = ZA || M = ZA || xWA|| yWA || m 4 e = H256(M*) = H256(ZA || xWA|| yWA || m) 5 同右 6 同右 7 同右 |
1 验证签名值r有效性。 2 验证签名值s有效性。 3 M* = ZA || M 4 e = H256(M*) = H256(ZA || m) 5 t = (r + s) mod n 6 (x1, y1) = Q = [s]G + [t]PA 7 R = (e + x1) mod q。若R = r,则验证通过;否则不通过。 |
★与SM2验签算法的差异:
- 输入参数不同:是用户A的声明公钥WA,真正的公钥要临时生成。
- ZA的算法不同,最后两个参数不是用户A的公钥,而是主公钥。
- 需要先利用A的声明公钥WA恢复A的真正公钥PA,
后面执行的其它步骤与标准的SM2验签相同。
验签流程对比如下图(无证书签名 VS 标准的SM2签名)。
图4-1 验签流程对比
(无证书验签 VS 标准SM2验签)
5. 无证书加密
表5-1 无证书加密算法与标准SM2加密算法的对比
SM2无证书加密算法 |
标准SM2加密算法 | |
输入 消息M |
M,消息的比特长度为mlen |
M,消息的比特长度为mlen |
输入 公钥PA |
用声明公钥WA=( xWA|| yWA)计算 1) λ= H256(xWA|| yWA || HA) 2) PA = WA + [λ]PPUB. |
PA |
输出 |
密文C |
密文C |
步骤 |
(步骤同SM2加密) |
(标准SM2加密算法步骤) |
同右,略。 |
1 k ∈R Zq* 2 C1 = [k]G. 3 (x2, y2) = [k]PA. 4 t = KDF(x2 || y2, klen). 其中klen为消息m的比特长度 5 C2 = m⊕t 6 C3 = H(x2 || m || y2). 7 返回密文C = (C1, C3, C2). |
★与SM2加密算法的差异:
- 需要先利用A的声明公钥WA恢复A的真正公钥PA,
后面执行的其它步骤与标准的SM2加密相同。
加密流程对比如下图(无证书加密 VS 标准的SM2加密)。
图5-1 加密流程对比
(无证书加密 VS 标准SM2加密)
6 无证书解密
完全同SM2解密算法
表6-1 无证书解密算法与标准SM2解密算法的对比
SM2无证书解密算法 |
标准SM2解密算法 | |
输入 密文C |
C |
C |
输入 私钥dA |
dA |
dA |
输出 |
明文M |
密文C |
步骤 |
(步骤同SM2解密) |
(标准SM2解密算法步骤) |
同右,略。 |
1 验证C1为ECPT(即满足曲线方程) 2 若S = [h]C1为无穷远点报错。 3 (x2, y2) = [dA]C1 4 t = KDF(x2, y2, klen) 5 M = C2⊕t 6 u = H(x2 || m || y2),若u≠C3,则报错。 7 输出明文M |
★无证书解密与SM2标准解密算法的差异:
无。
解密流程对比图——无差异,略。
7. 工程实现解析
无证书实现的关键点:
- 密钥生成方案的实现:与SM2大相径庭,复杂,需交互。★
- 加密解密签名验签:主要实现与现有SM2有差异的地方。
参考文献
- GM/T 0130-2023. 基于SM2算法的无证书及隐式证书公钥机制(征求意见稿),2023.
- 程朝辉. 基于标识的数字签名方法和装置[P]. CN201710792638.7. 2017-11-24.