1. 整体架构
整体架构分三层(如图1):
l 接口层:提供对外接口以完成SM9功能。主要分为:
n 系统接口:主要完成KGC参与的工作。
n 功能接口:主要完成KGC不参与的工作。
l SM9功能层:提供SM9的功能模块。主要分成:
n 主密钥生成:KGC公私钥的生成。
n 用户密钥生成:生成用户私钥,用户公钥任意设定。
n 加密和解密。
n 签名和验签。
n 密钥协商。
l 底层模块:为完成SM9功能所需的各种模块。
n 核心模块:大整数运算、椭圆曲线运算和配对运算是其中最重要也是最核心的模块,将是本次开发的难点和重点。特别是配对模块,是SM9的特色。
n 密钥导出函数KDF、H1、H2、SM3为密码辅助函数。
n 随机数生成器PRN。
图1 整体架构
A.1. 系统基本功能
A.1.1 主密钥生成
主密钥生成 |
数字签名 |
密钥交换 |
加解密/封装 |
主私钥 |
s∈[1, N−1] |
s∈[1, N−1] |
s∈[1, N−1] |
主私钥长 |
L |
L |
L |
主公钥 |
Ppub=[s]P2∈G2 |
Ppub=[s]P1∈G1 |
Ppub=[s]P1∈G1 |
主公钥长 |
4L(E(Fq2)点) |
2L(E(Fq)点) |
2L(E(Fq)点) |
私钥生成函数识别符 |
hid,一个字节 |
hid,一个字节 |
hid,一个字节 |
调用库 |
EC- E(Fq2) |
EC- E(Fq) |
EC- E(Fq) |
|
异 |
同 |
同 |
A.1.2 用户公私钥生成
用户公私钥生成 |
数字签名 |
密钥交换 |
加解密/封装 |
主私钥 |
s∈[1, N−1] |
s∈[1, N−1] |
s∈[1, N−1] |
主私钥长 |
L |
L |
L |
用户公钥 |
用户标识IDA |
用户标识IDA |
用户标识IDA |
用户公钥长 |
任意长度 |
任意长度 |
任意长度 |
用户私钥 |
dA∈G1, t1=H1(IDA||hid, N)+s mod N, t2=s×t1-1 mod N dA=[t2]P1 |
dA∈G2, t1=H1(IDA||hid, N)+s mod N, t2=s×t1-1 mod N dA=[t2]P2 |
dA∈G2, t1=H1(IDA||hid, N)+s mod N, t2=s×t1-1 mod N dA=[t2]P2 |
用户私钥长 |
2L(E(Fq)点) |
4L(E(Fq2)点) |
4L(E(Fq2)点) |
|
异 |
同 |
同 |
A.2 第2部分——数字签名算法
A.2.1 签名(User A)
A.2.2 验签(User B)
A.2.3 原理
关键是考虑签名时w的生成和验签时w的生成。
签名时:
验签时
由上面推导知,签名和验签计算的w相等,所以由w计算出来的h相等。
A.3 第3部分——密钥交换协议
A.3.1 密钥交换(User A & User B)
A.3.2 原理
首先,用户A(B)私钥的生成方式为
从以上推导可知,两个用户生成的g1,g2,g3相等,所以KDF计算出来的密钥相等。
可选步骤中的Hash比较,原理很简单。
A.4 第4部分——密钥封装和加解密
A.4.1 密钥封装(User A)
K是用户A的生成密钥,C是封装信息,用于对方解封得到相同的密钥K。
A.4.2 密钥解封(User B)
A.4.3 密钥封装原理
从以上推导可知,双方计算出来的w相等,C是一样的,所以KDF计算值相等
A.4.4 加密(User A)
|
流加密 |
分组加密 |
klen |
k1长度+k2长度 |
k1长度+k2长度 |
k1长度 |
M长度 |
对称密码算法的密钥长度 |
k2长度 |
未定义,测试向量中为256 |
未定义,测试向量中为256 |
C2 |
C2=K1⊕M |
C2=Enc(K1, M) |
A.4.5 解密(User B)
|
流加密 |
分组加密 |
klen |
k1长度+k2长度 |
k1长度+k2长度 |
k1长度 |
C2长度 |
对称密码算法的密钥长度 |
k2长度 |
未定义,测试向量中为256 |
未定义,测试向量中为256 |
C2 |
M =K1⊕C2 |
M=Enc(K1, C2)
|
A.4.6 加解密原理
同密钥封装原理
A.4.6 加解密原理
同密钥封装原理