SM9 - 密钥交换协议

符号
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]\)

  1. 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\)
  2. 计算\(hlen=8×⌈(5×(\log{2}{⁡n}))⁄32⌉\)
  3. \(i\)\(1\)\(⌈hlen⁄v⌉\)执行:
    3.1. 计算\(Ha_i=H_v⁡(\mbox{0x01}‖Z‖ct)\)
    3.2. \(ct++\)
  4. \(hlen⁄v\)是整数,令\(Ha!_{⌈hlen⁄v⌉} =Ha_{⌈hlen⁄v⌉}\) ,否则令\(Ha!_{⌈hlen⁄v⌉}\)\(Ha_{⌈hlen⁄v⌉}\) 最左边的\((hlen-(v×⌊hlen⁄v⌋))\)比特;
  5. \(Ha=Ha_1 ‖Ha_2 ‖⋯‖Ha_{⌈hlen⁄v⌉-1} ‖Ha!_{⌈hlen⁄v⌉}\)
  6. 计算\(h_1=(Ha\mod{(n-1)})+1\)

密钥派生函数
设密码杂凑函数为\(H_v ()\),其输出是长度为\(v\)比特的杂凑值。
密钥派生函数\(KDF⁡(Z,klen)\)
输入:比特串\(Z\),整数\(klen\)(表示要获得的密钥数据的比特长度,要求该值小于\((2^{32}-1)v\))。
输出:长度为\(klen\)的密钥数据比特串\(K\)

  1. 初始化一个32比特构成的计数器\(ct=\mbox{0x00000001}\)
  2. \(i\)\(1\)\(⌈klen⁄v⌉\)执行:
    2.1. 计算\(Ha_i=H_v⁡(Z‖ct)\)
    2.2. \(ct++\)
  3. \(klen⁄v\)是整数,令\(Ha!_{⌈klen⁄v⌉} =Ha_{⌈klen⁄v⌉}\) ,否则令\(Ha!_{⌈klen⁄v⌉}\)\(Ha_{⌈klen⁄v⌉}\) 最左边的\((klen-(v×⌊klen⁄v⌋))\)比特;
  4. \(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的加密私钥为

$ \left. \left\{ \begin{matrix} {t_{1} = {H_{1}\left( {\left. {ID}_{A} \right\| hid,N} \right)} + ke} \\ {t_{3} = {H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} + ke} \end{matrix} \right.\Rightarrow\left\{ \begin{matrix} {t_{2} = ke \cdot {t_{1}}^{- 1}} \\ {t_{4} = ke \cdot {t_{3}}^{- 1}} \end{matrix} \right.\Rightarrow\left\{ \begin{matrix} {{de}_{A} = \left\lbrack t_{2} \right\rbrack P_{2}} \\ {{de}_{B} = \left\lbrack t_{4} \right\rbrack P_{2}} \end{matrix} \right. \right. $
进而步骤A1、B1有
$ \left\{ \begin{matrix} {Q_{A} = \left\lbrack {H_{1}\left( {\left. {ID}_{A} \right\| hid,N} \right)} \right\rbrack P_{1} + P_{pub - e} = \left\lbrack {{H_{1}\left( {\left. {ID}_{A} \right\| hid,N} \right)} + ke} \right\rbrack P_{1} = \left\lbrack t_{1} \right\rbrack P_{1}} \\ {Q_{B} = \left\lbrack {H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} \right\rbrack P_{1} + P_{pub - e} = \left\lbrack {{H_{1}\left( {\left. {ID}_{B} \right\| hid,N} \right)} + ke} \right\rbrack P_{1} = \left\lbrack t_{3} \right\rbrack P_{1}} \end{matrix} \right. $
则对于步骤A3、B3有
$ \left\{ \begin{matrix} {R_{A} = \left\lbrack r_{A} \right\rbrack Q_{B} = \left\lbrack {r_{A} \cdot t_{3}} \right\rbrack P_{1}} \\ {R_{B} = \left\lbrack r_{B} \right\rbrack Q_{A} = \left\lbrack {r_{B} \cdot t_{1}} \right\rbrack P_{1}} \end{matrix} \right. $
此时,观察步骤B4及A5获得$g_1$、$g_2$、$g_3$及$g_1'$、$g_2'$、$g_3'$具有如下关系(双线性对的性质参阅注2)
$ \left\{ \begin{array}{l} {g_{1} = {e\left( {R_{A},{de}_{B}} \right)} = {e\left( {\left\lbrack {r_{A} \cdot t_{3}} \right\rbrack P_{1},\left\lbrack {ke \cdot {t_{3}}^{- 1}} \right\rbrack P_{2}} \right)} = {e\left( {P_{1},P_{2}} \right)}^{r_{A} \cdot ke} = {e\left( {\left\lbrack {ke} \right\rbrack P_{1},P_{2}} \right)}^{r_{A}} = {e\left( {P_{pub - e},P_{2}} \right)}^{r_{A}} = g_{1}'} \\ {g_{2} = {e\left( {P_{pub - e},P_{2}} \right)}^{r_{B}} = {e\left( {\left\lbrack {ke} \right\rbrack P_{1},P_{2}} \right)}^{r_{B}} = {e\left( {P_{1},P_{2}} \right)}^{r_{B} \cdot ke} = {e\left( {\left\lbrack {r_{B} \cdot t_{1}} \right\rbrack P_{1},\left\lbrack {ke \cdot {t_{1}}^{- 1}} \right\rbrack P_{2}} \right)} = {e\left( {R_{B},{de}_{A}} \right)} = g_{2}'} \\ {g_{3} = {g_{1}}^{r_{B}} = {e\left( {P_{1},P_{2}} \right)}^{r_{A} \cdot r_{B} \cdot ke} = \left( {g_{2}'} \right)^{r_{A}} = g_{3}'} \end{array} \right. $
所以,步骤A7及B5的计算
$ \left\{ \begin{array}{l} {{SK}_{A} = {\mathit{KDF}\left( {\left. {ID}_{A} \right\|\left. {ID}_{B} \right\|\left. R_{A} \right\|\left. R_{B} \right\|\left. g_{1}' \right\|\left. g_{2}' \right\| g_{3}',klen} \right)}} \\ {{SK}_{B} = {\mathit{KDF}\left( {\left. {ID}_{A} \right\|\left. {ID}_{B} \right\|\left. R_{A} \right\|\left. R_{B} \right\|\left. g_{1} \right\|\left. g_{2} \right\| g_{3},klen} \right)}} \end{array} \right. $
有$SK_A=SK_B$,即用户A、B会获得相同的共享秘密密钥。同时,对于验证步骤A6、A8及B6、B8有
$ \left\{ \begin{array}{l} {S_{A} = {{\mathit{Has}h}\left( {\left. \text{0}\text{x}83 \right\|\left. g_{1}' \right\|{{\mathit{Has}h}\left( {\left. g_{2}' \right\|\left. g_{3}' \right\|\left. {ID}_{A} \right\|\left. {ID}_{B} \right\|\left. R_{A} \right\| R_{B}} \right)}} \right)} = S_{2}} \\ {S_{B} = {{\mathit{Has}h}\left( {\left. \text{0}\text{x}82 \right\|\left. g_{1} \right\|{{\mathit{Has}h}\left( {\left. g_{2} \right\|\left. g_{3} \right\|\left. {ID}_{A} \right\|\left. {ID}_{B} \right\|\left. R_{A} \right\| R_{B}} \right)}} \right)} = S_{1}} \end{array} \right. $
即在计算无误、传输无误、过程中无篡改、未受伪造、未受密码分析的攻击等情况时验证可通过,且可以保证用户双方共享相同的秘密密钥。

注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

posted @ 2025-01-16 15:57  Miro'  阅读(333)  评论(0)    收藏  举报