国家标准全文公开系统:http://openstd.samr.gov.cn/
本文参考:http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=370AF152CB5CA4A377EB4D1B21DECAE0
系统参数
- 域 F q F_q Fq的描述
- 椭圆曲线的两个定义元 a , b ∈ F q a,b \in F_q a,b∈Fq
- E ( F q ) E(F_q) E(Fq)的基点 G = ( x G , y G ) ≠ O G=(x_G,y_G) \not = O G=(xG,yG)=O,其中 x G , y G ∈ F q x_G,y_G \in F_q xG,yG∈Fq
- G G G的阶 n n n, [ n ] G = O [n]G=O [n]G=O
- 其他可选项,如 n n n的余因子 h : = # E ( F q ) n h:=\dfrac{\#E(F_q)}{n} h:=n#E(Fq)
- 用户 B B B的密钥对:私钥 d B d_B dB,公钥 P B = [ d B ] G P_B = [d_B]G PB=[dB]G
- 用户 A A A可以获得 P B P_B PB以及其他系统参数
辅助函数
-
密码学杂凑函数,如 S M 3 SM3 SM3
-
密钥派生算法:确定性算法,要用到密码学杂凑函数,从一个共享的秘密比特串中派生出密钥数据。在密钥协商过程中,密钥派生函数作用在密钥交换所获共享的秘密比特串上,从中产生所需的会话密钥或进一步加密所需的密钥数据。
K D F ( Z , l e n ) KDF(Z,len) KDF(Z,len)
输入:比特串 Z Z Z,整数 l e n len len
输出: l e n len len比特的密钥数据
- 初始化32比特计数器 c t = 0 x 00000001 ct=0x00000001 ct=0x00000001
- 对于
i
∈
[
1
,
2
,
⋯
,
⌈
l
e
n
v
⌉
]
i \in [1,2,\cdots,\lceil \dfrac{len}{v} \rceil]
i∈[1,2,⋯,⌈vlen⌉]执行
- K i = H ( Z ∥ c t ) K_i = H(Z \| ct) Ki=H(Z∥ct),这里 H H H是输出 v v v比特的哈希函数
- c t = c t + 1 ct=ct+1 ct=ct+1,计数器自增
- 令 K ˉ = K 1 ∥ K 2 ∥ ⋯ ∥ K ⌈ l e n v ⌉ \bar K = K_1 \| K_2 \| \cdots \| K_{\lceil \frac{len}{v} \rceil} Kˉ=K1∥K2∥⋯∥K⌈vlen⌉
- 截取 K ˉ \bar K Kˉ最左边的 l e n len len比特作为 K K K
-
伪随机数生成器 P R G PRG PRG
公钥加密算法
-
加密 E n c p k ( M ) Enc_{pk}(M) Encpk(M),其中明文 M M M为 l e n len len长的比特串
B 1 B_1 B1:计算椭圆曲线点 S = [ h ] P B S = [h]P_B S=[h]PB,若 S = O S=O S=O则报错退出
B 2 B_2 B2:使用 P R G PRG PRG得到 k ∈ [ 1 , n ) ∩ Z k \in [1,n) \cap Z k∈[1,n)∩Z
B 3 B_3 B3:计算椭圆曲线点 C 1 = [ k ] G = ( x 1 , y 1 ) C_1 = [k]G = (x_1,y_1) C1=[k]G=(x1,y1),转化为比特串
B 4 B_4 B4:计算椭圆曲线点 C 2 = [ k ] P B = ( x 2 , y 2 ) C_2 = [k]P_B = (x_2,y_2) C2=[k]PB=(x2,y2),转化为比特串
B 5 B_5 B5:计算 t = K D F ( x 2 ∥ y 2 , l e n ) t=KDF(x_2 \| y_2,len) t=KDF(x2∥y2,len),若 t = 0 t=0 t=0则重新生成 k k k
B 6 B_6 B6:计算差分 C 3 = M ⊕ t C_3 = M \oplus t C3=M⊕t
B 7 B_7 B7:计算摘要 C 4 = H ( x 2 ∥ M ∥ y 2 ) C_4 = H(x_2 \| M \| y_2) C4=H(x2∥M∥y2)
B 8 B_8 B8:输出密文 C = C 1 ∥ C 4 ∥ C 3 = ( x 1 , y 1 ) ∥ H ( x 2 ∥ M ∥ y 2 ) ∥ M ⊕ t C = C_1 \| C_4 \| C_3 = (x_1,y_1) \| H(x_2 \| M \| y_2) \| M \oplus t C=C1∥C4∥C3=(x1,y1)∥H(x2∥M∥y2)∥M⊕t -
解密 D e c s k ( C ) Dec_{sk}(C) Decsk(C),其中 C = C 1 ∥ C 4 ∥ C 3 C = C_1 \| C_4 \| C_3 C=C1∥C4∥C3, C 3 C_3 C3为 l e n len len长比特串
A 1 A_1 A1:取出点 C 1 C_1 C1,验证是否满足椭圆曲线方程,不满足则报错退出
A 2 A_2 A2:计算椭圆曲线点 [ d B ] C 1 = ( x 2 , y 2 ) [d_B]C_1 = (x_2,y_2) [dB]C1=(x2,y2),转化为比特串
A 3 A_3 A3:计算 t = K D F ( x 2 ∥ y 2 , l e n ) t=KDF(x_2 \| y_2,len) t=KDF(x2∥y2,len),若 t = 0 t=0 t=0则报错退出
A 4 A_4 A4:计算差分 M ′ = C 3 ⊕ t M'=C_3 \oplus t M′=C3⊕t
A 5 A_5 A5:计算摘要 C 4 ′ = H ( x 2 ∥ M ′ ∥ y 2 ) C_4' = H(x_2 \| M' \| y_2) C4′=H(x2∥M′∥y2)
A 6 A_6 A6:验证是否满足 C 4 ′ = C 4 C_4' = C_4 C4′=C4,不满足则报错退出
A 7 A_7 A7:输出 l e n len len长比特串 M ′ M' M′