计算t=KDF(x_2 ||y_2,klen) ,若 t 为全0 的比特串,则返回(1); 计算C_2 =M\oplus t; 计算C_3 =Hash(x_2 ||M||y_2) ; 输出密文 C =(C_1,C_2,C_3) . 其中第(5)步 KDF () 是密钥派生函数,其本质上就是一个伪随机数产生函数,用来产生密钥,取为密码哈希函数SM3。第(7)步 Ha...
(x2,y2)=[d]C1 t=KDF(m2||y2,klen) M' = C2+t u=Hash(x2||M'||y2), u ?= C3 M`为明文
在A3步骤中,刚开始看文档没明白 h 值是什么,后来才理解到这就是曲线参数的 cofactor,而且这个步骤主要是验证公钥PB的有效性,略过也没问题。 在A5步骤中,有个KDF函数需要实现。KDF函数的流程如下,其中的Hv函数请使用SM3: A7步骤的Hash也采用SM3 在最后拼接 C1 || C3 || C2 步骤,并不是把这些字节拼接起来...
t ← sm2_kdf(𝑥2 ||𝑦2 , mlen, hash𝑣 ) if 𝑡为全0比特串 then 回到函数开头,重新选取𝑘 𝐶2 ← plaintext ⊕ 𝑡 𝐶3 ← hash𝑣 (𝑥2 ||plaintext||𝑦2 ) return 𝐶1 𝐶3 𝐶2 密钥派生算法 密钥派生算法sm2_kdf需要借助摘要长度为𝑣字节的哈希函数hash𝑣 ,生成指...
KDF是Key derivation function的缩写,意思是基于一个固定的输入,计算出一个确定的值,该计算过程最常见的使用场景是基于一个口令,生成一串密码字符。KDF的本身实现SM2的规范也定义了。 因此通过KDF,我们基于输入x_2,y_2和klen计算得到t。 结论2:计算t需要知道x_2,y_2和klen,klen是M的bit长度,实际上也是C_2的...
A5:计算t=KDF(x2 ∥ y2, klen),若 t 为全0比特串,则返回 A1; A6:计算C2=M ⊕ t; A7:计算C3=Hash(x2 ∥ M ∥ y2); A8:输出密文C=C1 ∥ C2 ∥ C3。 解密过程: 设klen为密文中C2的比特长度。 为了对密文C=C1 ∥ C2 ∥ C3 进行解密,作为解密者的用户 B 应实现以下运算步骤: ...
4.计算t=KDF(x2 ∥y2, klen),若t为全0比特串,则报错并退出 5.从C中取出比特串C2,计算M′ = C2 ⊕t 6.计算u = Hash(x2 ∥ M′ ∥ y2),从C中取出比特串C3,若u ̸= C3,则报错并退出 7.输出明文M′ 解密算法流程: ③:SM2椭圆曲线公钥密码算法推荐曲线参数 ...
(kdf(zl, zr, msglen, outmsg) == 0) goto exit_sm2_decrypt; //计算t for(i = 0; i < msglen; i++) { outmsg[i] ^= msg[i+64]; } //计算M到outsmg memcpy(tmp, zl, 32); memcpy(tmp+32, outmsg, msglen); memcpy(tmp+32+msglen, zr, 32); sm3(tmp, 64+msglen, c3);...
KDF是sm2的密钥派生函数c2 = M+t C3 = Hash(x2||M||y2)C= C1||C2||C3解密C为加密后的结果,klen为密文中C2的长度C1 = C里面获取 ,验证C1是否满足椭圆曲线。//C2长度确定,可以获取C1内容。S=[h]C1,S为无穷点,退出。(x2,y2)=[d]C1 t=KDF(m2||y2,klen)M' = C2+t u=Hash(x2||M'|...
(5)计算t=KDF(x2 ll y2, klen),若t为全0比特串,则返回(1); (6)计算C2= M t; (7)计算C3= Hash(x2||M||y2); (8)输出密文C=C1||C2||C3. 图1 加密算法流程 2.SM2的解密算法 设klen为密文中C2的比特长度。 为了对密文C=C1||C2||C3进行解密,作为解密者的用户B应实现以下运算步骤: ...