符号
A,B:使用公钥密码系统的两个用户。
\(cf\):椭圆曲线阶相对于\(N\)的余因子。
\(cid\):用一个字节表示的曲线的标识符,其中\(\mbox{0x10}\)表示\(F_p\)(素数\(P>2^{191}\))上常曲线(即非超奇异曲线),\(\mbox{0x11}\)表示\(F_p\)表示超奇异曲线,\(\mbox{0x12}\)表示\(F_p\)上常曲线及其扭曲线。
\(de_A\):用户A的加密私钥。
\(de_B\):用户B的加密私钥。
\(e\):从\(G_1×G_2\)到\(G_T\)的双线性对。
\(eid\):用一个字节表示的双线性对\(e\)的标识符,其中\(\mbox{0x01}\)表示Tate对,\(\mbox{0x02}\)表示Weil对,\(\mbox{0x03}\)表示Ate对,\(\mbox{0x04}\)表示R-ate对。
\(G_T\):阶为素数\(N\)的乘法循环群。
\(G_1\):阶为素数\(N\)的加法循环群。
\(G_2\):阶为素数\(N\)的加法循环群。
\(g^u\):乘法群\(G_T\)中元素\(g\)的\(u\)次幂,\(g^{u} = \underset{u\text{个}}{\underbrace{g \cdot g \cdot \ldots \cdot g}}\),\(u\)是正整数。
\(H_v()\),\(Hash()\):密码杂凑函数。
\(H_1()\):由密码杂凑函数派生的密码函数。
\(hid\):本部分中,用一个字节表示的加密私钥生成函数识别符,由KGC选择并公开。
\(ID_A\):用户A的表示,可以唯一确定用户A的公钥。
\(ID_B\):用户B的表示,可以唯一确定用户B的公钥。
\(KDF()\):密钥派生函数。
\(N\):循环群\(G_1\)、\(G_2\)和\(G_T\)的阶,为大于\(2^{191}\)的素数。
\(P_{pub-e}\):加密主公钥。
\(P_1\):群\(G_1\)的生成元。
\(P_2\):群\(G_2\)的生成元。
\(r_A\):密钥交换中用户A产生的临时密钥值。
\(r_B\):密钥交换中用户B产生的临时密钥值。
\(SK_A\)、\(SK_B\):密钥交换协议商定的共享秘密密钥。
\(ke\):加密主私钥。
\(〈P〉\):由元素\(P\)生成的循环群。
\([u]P\):加法群\(G_1\)、\(G_2\)中元素\(P\)的\(u\)倍。
\(⌈x⌉\):顶函数,大于或等于\(x\)的最小整数。例如,\(⌈7⌉=7\),\(⌈8.3⌉=9\)。
\(⌊x⌋\):底函数,小于或等于\(y\)的最大整数。例如,\(⌊7⌋=7\),\(⌊8.3⌋=8\)。
\(x‖y\):\(x\)与\(y\)的拼接,其中\(x\)和\(y\)是比特串或字节串。
\([x,y]\):大于或等于\(x\)且小于或等于\(y\)的整数的集合。
\(β\):扭曲线参数。
系统加密主密钥和用户加密密钥的产生
KGC产生随机数\(ke∈[1,N-1]\)作为加密主私钥,计算\(G_1\)中的元素\(P_{pub-e}=[ke]P_1\)作为加密主公钥,则加密主密钥对为\((ke,P_{pub-e})\)。KGC秘密保存\(ke\),公开\(P_{pub-e}\)。
KGC选择并公开用一个字节表示的加密私钥生成函数识别符\(hid\)。
用户A和用户B的表示分别为\(ID_A\)和\(ID_B\)。为产生用户A的加密私钥\(de_A\),KGC首先在有限域\(F_N\)上计算\(t_1=H_1(ID_A ‖hid,N)+ke\),若\(t_1=0\)则需重新产生加密主私钥,计算和公开加密主公钥,并更新已有用户的加密私钥;否则计算\(t_2=ke⋅{t_1}^{-1}\),然后计算\(de_A=[t_2 ] P_2\)。为产生用户B的加密私钥\(de_B\),KGC首先在有限域\(F_N\)上计算\(t_3=H_1(ID_B ‖hid,N)+ke\),若\(t_3=0\)则需重新产生加密主私钥,计算和公开加密主公钥,并更新已有用户的加密私钥;否则计算\(t_4=ke⋅{t_3}^{-1}\),然后计算\(de_B=[t_4 ] P_2\)。
密码杂凑函数\(H_v()\)
密码杂凑函数\(H_v ()\)的输出是长度恰为\(v\)比特的杂凑值。本部分规定使用国家密码管理主管部门批准的密码杂凑函数,如SM3密码杂凑算法。
密码函数\(H_1 ()\)
密码函数\(H_1(Z,n)\)的输入为比特串\(Z\)和整数\(n\),输出为一个整数\(h_1∈[1,n-1]\)。\(H_1(Z,n)\)需要调用密码杂凑函数\(H_v ()\)。
密码函数\(H_1(Z,n)\):
输入:比特串\(Z\),整数\(n\)。
输出:整数\(h_1∈[1,n-1]\)。
- 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\);
- 计算\(hlen=8×⌈(5×(\log{2}{n}))⁄32⌉\);
- 对\(i\)从\(1\)到\(⌈hlen⁄v⌉\)执行:
3.1. 计算\(Ha_i=H_v(\mbox{0x01}‖Z‖ct)\);
3.2. \(ct++\); - 若\(hlen⁄v\)是整数,令\(Ha!_{⌈hlen⁄v⌉} =Ha_{⌈hlen⁄v⌉}\) ,否则令\(Ha!_{⌈hlen⁄v⌉}\) 为\(Ha_{⌈hlen⁄v⌉}\) 最左边的\((hlen-(v×⌊hlen⁄v⌋))\)比特;
- 令\(Ha=Ha_1 ‖Ha_2 ‖⋯‖Ha_{⌈hlen⁄v⌉-1} ‖Ha!_{⌈hlen⁄v⌉}\) ;
- 计算\(h_1=(Ha\mod{(n-1)})+1\)。
密钥派生函数
设密码杂凑函数为\(H_v ()\),其输出是长度为\(v\)比特的杂凑值。
密钥派生函数\(KDF(Z,klen)\):
输入:比特串\(Z\),整数\(klen\)(表示要获得的密钥数据的比特长度,要求该值小于\((2^{32}-1)v\))。
输出:长度为\(klen\)的密钥数据比特串\(K\)。
- 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\);
- 对\(i\)从\(1\)到\(⌈klen⁄v⌉\)执行:
2.1. 计算\(Ha_i=H_v(Z‖ct)\);
2.2. \(ct++\); - 若\(klen⁄v\)是整数,令\(Ha!_{⌈klen⁄v⌉} =Ha_{⌈klen⁄v⌉}\) ,否则令\(Ha!_{⌈klen⁄v⌉}\) 为\(Ha_{⌈klen⁄v⌉}\) 最左边的\((klen-(v×⌊klen⁄v⌋))\)比特;
- 令\(K=Ha_1 ‖Ha_2 ‖⋯‖Ha_{⌈klen⁄v⌉-1} ‖Ha!_{⌈klen⁄v⌉}\) 。
密钥交换协议
设用户A和用户B协商获得密钥数据的长度为\(klen\)比特,用户A为发起方,用户B为响应方。用户A和用户B双方为了获得相同的密钥,应实现如下运算步骤:
用户A:
A1.计算群\(G_1\)中的元素\(Q_B=[H_1(ID_B ‖hid,N) ] P_1+P_{pub-e}\);
A2.产生随机数\(r_A∈[1,N-1]\);
A3.计算群\(G_1\)中的元素\(R_A=[r_A ] Q_B\);
A4.将\(R_A\)发送给用户B;
用户B:
B1.计算群\(G_1\)中的元素\(Q_A=[H_1(ID_A ‖hid,N) ] P_1+P_{pub-e}\);
B2.产生随机数\(r_B∈[1,N-1]\);
B3.计算群\(G_1\)中的元素\(R_B=[r_B ] Q_A\);
B4.验证\(R_A∈G_1\)是否成立,若不成立则协商失败;否则计算群\(G_T\)中的元素\(g_1=e(R_A,de_B )\),\(g_2={e(P_{pub-e},P_2 )}^{r_B }\),\(g_3={g_1}^{r_B }\);
B5.计算\(SK_B=KDF(ID_A ‖ID_B ‖R_A ‖R_B ‖g_1 ‖g_2 ‖g_3,klen)\);
B6.(选项)计算\(S_B=Hash(\mbox{0x82}‖g_1 ‖Hash(g_2 ‖g_3 ‖ID_A ‖ID_B ‖R_A ‖R_B ) )\);
B7.将\(R_B\)、(选项\(S_B\))发送给用户A;
用户A:
A5.验证\(R_B∈G_1\)是否成立,若不成立则协商失败;否则计算群\(G_T\)中的元素\(g_1'={e(P_{pub-e},P_2 )}^{r_A }\),\(g_2'=e(R_B,de_A )\),\(g_3'={(g_2')}^{r_A }\);
A6.(选项)计算\(S_1=Hash(\mbox{0x82}‖g_1'‖Hash(g_2'‖g_3'‖ID_A ‖ID_B ‖R_A ‖R_B ) )\),并检验\(S_1=S_B\)是否成立,若等式不成立则从B到A的密钥确认失败;
A7.计算\(SK_A=KDF(ID_A ‖ID_B ‖R_A ‖R_B ‖g_1'‖g_2'‖g_3',klen)\);
A8.(选项)计算\(S_A=Hash(\mbox{0x83}‖g_1'‖Hash(g_2'‖g_3'‖ID_A ‖ID_B ‖R_A ‖R_B ) )\),并将\(S_A\)发送给用户B;
用户B:
B8.(选项)计算\(S_2=Hash(\mbox{0x83}‖g_1 ‖Hash(g_2 ‖g_3 ‖ID_A ‖ID_B ‖R_A ‖R_B ) )\),并检验\(S_2=S_A\)是否成立,若等式不成立则从A到B的密钥确认失败。
注1:注意到加密主公钥为\(P_{pub-e}=[ke] P_1\),且用户A、B的加密私钥为
注2:双线性对
设\((G_1,+)\)、\((G_2,+)\)和\((G_T,⋅)\)是3个循环群,\(G_1\)、\(G_2\)和\(G_T\)的阶均为素数\(N\),\(P_1\)是\(G_1\)的生成元,\(P_2\)是\(G_2\)的生成元,存在\(G_2\)到\(G_1\)的同态映射\(ψ\)使得\(ψ(P_2 )=P_1\)。
双线性对\(e\)是\(G_1×G_2→G_T\)的映射,满足如下条件:
a) 双线性性:对任意的\(P∈G_1\),\(Q∈G_2\),\(a,b∈Z_N\),有\(e([a]P,[b]Q)={e(P,Q)}^{ab}\);
b) 非退化性:\(e(P_1,P_2 )≠1_{G_T }\);
c) 可计算性:对任意的\(P∈G_1\),\(Q∈G_2\),存在有效的算法计算\(e(P,Q)\)。
标准GM/T 0044.1—2016中7.1节、GM/T 0044.5—2016中3.1节规定了,SM9算法使用R-ate对(\(eid\):\(\mbox{0x04}\))。
参考
GM/T 0044.1—2016
GM/T 0044.3—2016
GM/T 0044.5—2016