SM2 - 公钥加密算法

符号
A,B:使用公钥密码系统的两个用户。
a,bFq中的元素,他们定义Fq上的一条椭圆曲线E
dB:用户B的私钥。
E(Fq)Fq上椭圆曲线E的所有有理点(包括无穷远点O)组成的集合。
Fq:包含q个元素的有限域。
G:椭圆曲线的一个基点,其阶为素数。
Hash():密码杂凑函数。
Hv():消息摘要长度为v比特的密码杂凑函数。
KDF():密钥派生函数。
M:待加密的消息。
M:解密得到的消息。
n:基点G的阶(nE(Fq)的素因子)。
O:椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
PB:用户B的公钥。
q:有限域Fq中元素的数目。
xyxy的拼接,其中xy是比特串或字节串。
[k]P:椭圆曲线上点Pk倍点,即:[k]P=P+P++Pk,其中k是正整数。
[x,y]:大于或等于x且小于或等于y的整数的集合。
x:顶函数,大于或等于x的最小整数。例如,7=78.3=9
x:底函数,小于或等于y的最大整数。例如,7=78.3=8
E(Fq)E(Fq)上点的数目,称为椭圆曲线E(Fq)的阶。

密钥派生函数
设密码杂凑函数为Hv(),其输出是长度为v比特的杂凑值。
密钥派生函数KDF(Z,klen)
输入:比特串Z,整数klen(表示要获得的密钥数据的比特长度,要求该值小于(2321)v)。
输出:长度为klen的密钥数据比特串K

  1. 初始化一个32比特构成的计数器ct=0x00000001
  2. i1klenv执行:
    2.1. 计算Hai=Hv(Zct)
    2.2. ct++
  3. klenv是整数,令Ha!klenv=Haklenv,否则令Ha!klenvHaklenv最左边的(klen(v×klenv))比特;
  4. K=Ha1Ha2Haklenv1Ha!klenv

加密算法
设需要发送的消息为比特串MklenM的比特长度。
为了对明文M进行加密,作为加密者的用户A应实现以下运算步骤:

  1. 用随机数发生器产生随机数k[1,n1]
  2. 计算椭圆曲线点C1=[k]G=(x1,y1)
  3. 计算椭圆曲线点S=[h]PB,若S是无穷远点,则报错并退出;
  4. 计算椭圆曲线点[k]PB=(x2,y2)
  5. 计算t=KDF(x2y2,klen),若t为全0比特串,则返回步骤1;
  6. 计算C2=Mt
  7. 计算C3=Hash(x2My2)
  8. 输出密文C=C1C2C3

解密算法
klen为密文中C2的比特长度。
为了对密文C=C1C2C3进行解密,作为解密者的用户B应实现以下运算步骤:

  1. C中取出比特串C1,验证C1是否满足椭圆曲线方程,若不满足则报错并退出;
  2. 计算椭圆曲线点S=[h]C1,若S是无穷远点,则报错并退出;
  3. 计算[dB]C1=(x2,y2)
  4. 计算t=KDF(x2y2,klen),若t为全0比特串,则报错并退出;
  5. C中取出比特串C2,计算M=C2t
  6. 计算u=Hash(x2My2),从C中取出比特串C3,若uC3,则报错并退出;
  7. 输出明文M

注:观察加密算法的步骤4与解密算法的步骤3,有如下等式成立

[k]PB=[kdB]G=(x2,y2)=[dBk]G=[dB]C1
,所以加密算法的步骤5与解密算法的步骤4,可以计算出相同的t




参考
GM/T 0003.4—2012

posted @   Miro'  阅读(124)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示