SM2 - $F_p$

1 符号和缩略语
\(a,b\)\(F_q\)中的元素,它们定义\(F_q\)上的一条椭圆曲线\(E\)
\(E\):有限域上由\(a\)\(b\)定义的一条椭圆曲线。
\(E⁡(F_q)\)\(F_q\)上椭圆曲线\(E\)的所以有理点(包括无穷远点\(O\))组成的集合。
\(F_p\):包含\(p\)个元素的素域。
\(F_q\):包含\(q\)个元素的有限域。
\(F_q^*\):由\(F_q\)中所有非零元构成的乘法群。
\(G\):椭圆曲线的一个基点,其阶为素数。
\(\mbox{gcd}(x,y)\)\(x\)\(y\)的最大公因子。
\(h\):余因子,\(h=♯⁡E⁡(F_q)⁄n\),其中\(n\)是基点\(G\)的阶。
\(\mbox{mod }n\):模\(n\)运算。
\(n\):基点\(G\)的阶(\(n\)\(♯⁡E⁡(F_q)\)的素因子)。
\(O\):椭圆曲线上的一个特殊点,称为无穷远点或零点,是椭圆曲线加法群的单位元。
\(P\)\(P=(x_P,y_P )\)是椭圆曲线上除\(O\)之外的一个点,其坐标\(x_P\)\(y_P\)满足椭圆曲线方程。
\(P_1+P_2\):椭圆曲线\(E\)上两个点\(P_1\)\(P_2\)的和。
\(p\):大于\(3\)的素数
\(q\):有限域\(F_q\)中元素的数目。
\(x_P\):点\(P\)\(x\)坐标。
\(x^{-1} \mbox{ mod } n\):使得\(x⋅y≡1(\mbox{mod } n)\)成立的唯一整数\(y\)\(1≤y≤n-1\)\(\mbox{gcd} ⁡(x,n)=1\)
\(x‖y\)\(x\)\(y\)的拼接,其中\(x\)\(y\)是比特串或字节串。
\(x≡y(\mbox{mod } n)\)\(x\)\(y\)\(n\)同余。亦即,\(x \mbox{ mod }n=y \mbox{ mod } n\)
\(y_P\):点\(P\)\(y\)坐标。
\(Z_p\):整数模\(p\)的剩余类环。
\(〈G〉\):基点\(G\)生成的循环群。
\([k]P\):椭圆曲线上点\(P\)\(k\)倍点,即:\(\lbrack k\rbrack P = \underset{k\text{个}}{\underbrace{P + P + \cdots + P}}\),其中\(k\)是正整数。
\([x,y]\):大于或等于\(x\)且小于或等于\(y\)的整数的集合。
\(⌈x⌉\):顶函数,大于或等于\(x\)的最小整数。例如,\(⌈7⌉=7\)\(⌈8.3⌉=9\)
\(⌊x⌋\):底函数,小于或等于\(y\)的最大整数。例如,\(⌊7⌋=7\)\(⌊8.3⌋=8\)
\(♯⁡E⁡(F_q )\)\(E⁡(F_q )\)上点的数目,称为椭圆曲线\(E⁡(F_q )\)的阶。


2 素域\(F_p\)
\(q\)是奇素数\(p\)时,素域\(F_p\)中的元素用整数\(0,1,2,…,p-1\)表示。

  1. 加法单位元是整数\(0\)
  2. 乘法单位元是整数\(1\)
  3. 域元素的加法是整数的模\(p\)加法,即若\(a,b∈F_p\),则\(a+b=(a+b)\mbox{ mod }p\)
  4. 域元素的乘法是整数的模\(p\)乘法,即若\(a,b∈F_p\),则\(a⋅b=(a⋅b)\mbox{ mod }p\)

2.1 有限域上的椭圆曲线
有限域\(F_q\)上的椭圆曲线是由点组成的集合。在仿射坐标系下,椭圆曲线上点\(P\)(非无穷远点)的坐标表示为\(P=(x_P,y_P )\),其中\(x_P\)\(y_P\)为满足一定方程的域元素,分别称为点\(P\)\(x\)坐标和\(y\)坐标。此处,称\(F_q\)为基域。

2.1.1 \(F_p\)上的椭圆曲线
定义在\(F_p\)\(p\)是大于\(3\)的素数)上的椭圆曲线方程为:
\(y^2=x^3+ax+b\)\(a,b∈F_p\),且\((4a^2+27b^2 )\mbox{ mod }p≠0\)
椭圆曲线\(E⁡(F_p )\)定义为:
\(E⁡(F_p )=\{(x,y)│y^2=x^3+ax+b,x,y∈F_p \}∪\{O\}\),其中\(O\)是无穷远点。
椭圆曲线\(E⁡(F_p )\)上的点的数目用\(♯⁡E⁡(F_p )\)表示,称为椭圆曲线\(E⁡(F_p )\)的阶。

2.1.2 \(F_p\)上的椭圆曲线群
椭圆曲线\(E⁡(F_p)\)上的点按照下面的加法运算规则,构成一个交换群:

  1. \(O+O=O\)
  2. \(∀P=(x,y)∈E⁡(F_p)\backslash\{O\}\)\(P+O=O+P=P\)
  3. \(∀P=(x,y)∈E⁡(F_p )\backslash\{O\}\)\(P\)的逆元素\(-P=(x,-y)\)\(P+(-P)=O\)
  4. 两个非互逆的不同点相加的规则:
    \(P_1=(x_1,y_1 )∈E⁡(F_p )\backslash\{O\}\)\(P_2=(x_2,y_2 )∈E⁡(F_p )\backslash\{O\}\),且\(x_1≠x_2\),设\(P_3=(x_3,y_3 )=P_1+P_2\),则
    \(\left\{ \begin{array}{l} {x_{3} = \lambda^{2} - x_{1} - x_{2}} \\ {y_{3} = \lambda\left( {x_{1} - x_{3}} \right) - y_{1}} \end{array} \right.\)
    其中
    \(\lambda = \frac{y_{2} - y_{1}}{x_{2} - x_{1}}\)
  5. 倍点规则:
    \(P_1=(x_1,y_1 )∈E⁡(F_p )\backslash\{O\}\),且\(y_1≠0\)\(P_3=(x_3,y_3 )=P_1+P_1\)
    \(\left\{ \begin{array}{l} {x_{3} = \lambda^{2} - 2x_{1}} \\ {y_{3} = \lambda\left( {x_{1} - x_{3}} \right) - y_{1}} \end{array} \right.\)
    其中
    \(\lambda = \frac{3x_{1}^{2} + a}{2y_{1}}\)

2.2 素域\(F_p\)的定义
\(p\)是一个素数,\(F_p\)\(\{0,1,2,…,p-1\}\)\(p\)个元素构成,称\(F_p\)为素域。加法单位元是整数\(0\),乘法单位元是整数\(1\)\(F_p\)的元素满足如下运算法则:
  ——加法:设\(a,b∈F_p\),则\(a+b=r\),其中\(r=(a+b)\mbox{ mod }p\)\(r∈[0,p-1]\)
  ——乘法:设\(a,b∈F_p\),则\(a⋅b=s\),其中\(s=(a⋅b)\mbox{ mod }p,r∈[0,p-1]\)
\(F_p^*\)是由\(F_p\)中所有非零元构成的乘法群,由于\(F_p^*\)是循环群,所以在\(F_p\)中至少存在一个元素\(g\),使得\(F_p\)中任一非零元都可以由\(g\)的一个方幂表示,称\(g\)\(F_p^*\)的生成元(或本原元),即\(F_p^*=\{g^i│0≤i≤p-2\}\)。设\(a=g^i∈F_p^*\),其中\(0≤i≤p-2\),则\(a\)的乘法逆元为:\(a^{-1}=g^{p-1-i}\)

2.3 \(F_p\)上椭圆曲线的定义
2.3.1 概述
\(F_p\)上椭圆曲线常用的表示形式有两种:仿射坐标表示和射影坐标表示。

2.3.2 仿射坐标表示
\(p\)是大于\(3\)的素数时,\(F_p\)上椭圆曲线方程在仿射坐标系下可以简化为\(y^2=x^3+ax+b\),其中\(a,b∈F_p\),且使得\((4a^2+27b^2 )\mbox{ mod }p≠0\)。椭圆曲线上的点集记为\(E⁡(F_p )=\{(x,y)│y^2=x^3+ax+b,x,y∈F_p \}∪\{O\}\),其中\(O\)是椭圆曲线的无穷远点。
\(E⁡(F_p )\)上的点按照下面的加法运算规则,构成一个阿贝尔群:

  1. \(O+O=O\)
  2. \(∀P=(x,y)∈E⁡(F_p )\backslash\{O\}\)\(P+O=O+P=P\)
  3. \(∀P=(x,y)∈E⁡(F_p )\backslash\{O\}\)\(P\)的逆元素\(-P=(x,-y)\)\(P+(-P)=O\)
  4. \(P_1=(x_1,y_1 )∈E⁡(F_p )\backslash\{O\}\)\(P_2=(x_2,y_2 )∈E⁡(F_p )\backslash\{O\}\)\(P_3=(x_3,y_3 )=P_1+P_2≠O\),则
    \( \left\{ \begin{array}{l} {x_{3} = \lambda^{2} - x_{1} - x_{2}} \\ {y_{3} = \lambda\left( {x_{1} - x_{3}} \right) - y_{1}} \end{array} \right.\)
    其中
    \(\lambda = \begin{cases} \frac{y_{2} - y_{1}}{x_{2} - x_{1}} & {\text{若}x_{1} \neq x_{2}} \\ \frac{3x_{1}^{2} + a}{2y_{1}} & {\text{若}x_{1} = x_{2}\text{且}P_{2} \neq - P_{1}} \end{cases}\)

2.3.3 射影坐标表示
2.3.3.1 标准射影坐标系
\(p\)是大于\(3\)的素数时,\(F_p\)上椭圆曲线方程在标准射影坐标系下可以简化为\(y^2 z=x^3+axz^2+bz^3\),其中\(a,b∈F_p\),且\((4a^2+27b^2 )\mbox{ mod }p≠0\)。椭圆曲线上的点集记为\(E⁡(F_p )=\{(x,y,z)│y^2 z=x^3+axz^2+bz^3,x,y,z∈F_p \}\)。对于\((x_1,y_1,z_1 )\)\((x_2,y_2,z_2 )\),若存在某个\(u∈F_p\)\(u≠0\),使得:\(x_1=ux_2\)\(y_1=uy_2\)\(z_1=uz_2\),则称这两个三元组等价,表示同一个点。
\(z≠0\),记\(X=x⁄z\)\(Y=y⁄z\),则可从标准射影坐标表示转化为仿射坐标表示:\(Y^2=X^3+aX+b\)
\(z=0\)\((0,1,0)\)对应的仿射坐标系下的点即无穷远点\(O\)
标准射影坐标系下,\(E⁡(F_p )\)上点的加法运算定义如下:

  1. \(O+O=O\)
  2. \(∀P=(x,y,z)∈E⁡(F_p )\backslash\{O\}\)\(P+O=O+P=P\)
  3. \(∀P=(x,y,z)∈E⁡(F_p )\backslash\{O\}\)\(P\)的逆元素\(-P=(ux,-uy,uz)\)\(u∈F_p\)\(P+(-P)=O\)
  4. 设点\(P_1=(x_1,y_1,z_1 )∈E⁡(F_p )\backslash\{O\}\)\(P_2=(x_2,y_2,z_2 )∈E⁡(F_p )\backslash\{O\}\)\(P_3=P_1+P_2=(x_3,y_3,z_3 )≠O\)
    \(P_1≠P_2\),则:
    \(λ_1=x_1 z_2\)\(λ_2=x_2 z_1\)\(λ_3=λ_1-λ_2\)\(λ_4=y_1 z_2\)\(λ_5=y_2 z_1\)\(λ_6=λ_4-λ_5\)\(λ_7=λ_1+λ_2\)\(λ_8=z_1 z_2\)\(λ_9=λ_3^2\)\(λ_{10}=λ_3 λ_9\)\(λ_{11}=λ_8 λ_6^2-λ_7 λ_9\)\(x_3=λ_3 λ_{11}\)\(y_3=λ_6 (λ_9 λ_1-λ_{11} )-λ_4 λ_{10}\)\(z_3=λ_{10} λ_8\)
    \(P_1=P_2\),则:
    \(λ_1=3x_1^2+az_1^2\)\(λ_2=2y_1 z_1\)\(λ_3=y_1^2\)\(λ_4=λ_3 x_1 z_1\)\(λ_5=λ_2^2\)\(λ_6=λ_1^2-8λ_1\)\(x_3=λ_2 λ_6\)\(y_3=λ_1 (4λ_4-λ_6 )-2λ_5 λ_3\)\(z_3=λ_2 λ_5\)

2.3.3.2 Jacobian加重映射坐标系
\(F_p\)上椭圆曲线方程在Jacobian加重射影坐标系下可以简化为\(y^2=x^3+axz^4+bz^6\),其中\(a,b∈F_p\),且\((4a^2+27b^2 )\mbox{ mod }p≠0\)。椭圆曲线上的点集记为\(E⁡(F_p )=\{(x,y,z)│y^2=x^3+axz^4+bz^6,x,y,z∈F_p \}\)。对于\((x_1,y_1,z_1 )\)\((x_2,y_2,z_2 )\),若存在某个\(u∈F_p\)\(u≠0\),使得:\(x_1=u^2 x_2\)\(y_1=u^2 y_2\)\(z_1=u^2 z_2\),则称这两个三元组等价,表示同一个点。
\(z≠0\),记\(X=x⁄z^2\)\(Y=y⁄z^3\),则可从Jacobian加重射影坐标表示转化为仿射坐标表示:\(Y^2=X^3+aX+b\)
\(z=0\)\((1,1,0)\)对应的仿射坐标系下的点即无穷远点\(O\)
Jacobian加重射影坐标系下,\(E⁡(F_p )\)上点的加法运算定义如下:

  1. \(O+O=O\)
  2. \(∀P=(x,y,z)∈E⁡(F_p )\backslash\{O\}\)\(P+O=O+P=P\)
  3. \(∀P=(x,y,z)∈E⁡(F_p )\backslash\{O\}\)\(P\)的逆元素\(-P=(u^2 x,-u^3 y,uz)\)\(u∈F_p\)\(P+(-P)=O\)
  4. 设点\(P_1=(x_1,y_1,z_1 )∈E⁡(F_p )\backslash\{O\}\)\(P_2=(x_2,y_2,z_2 )∈E⁡(F_p )\backslash\{O\}\)\(P_3=P_1+P_2=(x_3,y_3,z_3 )≠O\)
    \(P_1≠P_2\),则:
    \(λ_1=x_1 z_2^2\)\(λ_2=x_2 z_1^2\)\(λ_3=λ_1-λ_2\)\(λ_4=y_1 z_2^3\)\(λ_5=y_2 z_1^3\)\(λ_6=λ_4-λ_5\)\(λ_7=λ_1+λ_2\)\(λ_8=λ_4+λ_5\)\(x_3=λ_6^2-λ_7 λ_3^2\)\(y_3=λ_6 (λ_1 λ_3^2-x_3 )-λ_4 λ_3^3\)\(z_3=z_1 z_2 λ_3\)
    \(P_1=P_2\),则:
    \(λ_1=3x_1^2+az_1^4\)\(λ_2=4x_1 y_1^2\)\(λ_3=8y_1^4\)\(x_3=λ_1^2-2λ_2\)\(y_3=λ_1 (λ_2-x_3 )-λ_3\)\(z_3=2y_1 z_1\)

2.4 \(F_p\)上椭圆曲线的阶
\(F_p\)\(p\)是大于\(3\)的素数)上一条椭圆曲线的阶是指点集\(E⁡(F_p )\)中元素的个数,记为\(♯⁡E⁡(F_p )\)。由Hasse定理知:\(p+1-2p^{1⁄2}≤♯⁡E⁡(F_p ) ≤p+1+2p^{1⁄2}\)
若一条曲线的阶\(♯⁡E⁡(F_p ) =p+1\),则称此曲线为超奇异的,否则为非超奇异的。


3 椭圆曲线多倍点运算
3.1 概述
\(P\)是椭圆曲线\(E\)上阶为\(N\)的点,\(k\)为正整数,\(P\)\(k\)倍点为\(Q\),即

\( Q = \lbrack k\rbrack P = \underset{k\text{个}}{\underbrace{P + P + \cdots + P}}\)

3.2 椭圆曲线多倍点运算的实现
椭圆曲线多倍点运算的实现有多种方法,这里给出三种方法,以下都假设\(1≤k<N\)
算法一:二进制展开法
输入:点\(P\)\(l\)比特的整数\( k = {\sum\limits_{j = 0}^{l - 1}{k_{j}2^{j}}}\)\(k_j∈\{0,1\}\)
输出:\(Q=[k]P\)

  1. \(Q=O\);
  2. \(j\)\(l-1\)下降到\(0\)执行:
    2.1. \(Q=[2]Q\)
    2.2. 若\(k_j=1\),则\(Q=Q+P\)
  3. 输出\(Q\)

算法二:加减法
输入:点\(P\)\(l\)比特的整数\( k = {\sum\limits_{j = 0}^{l - 1}{k_{j}2^{j}}}\)\(k_j∈\{0,1\}\)
输出:\(Q=[k]P\)

  1. \(3k\)的二进制表示是\(h_r h_{r-1}…h_1 h_0\),其中最高位\(h_r\)\(1\)
  2. \(k\)的二进制表示是\(k_r k_{r-1}…k_1 k_0\),显然\(r=l\)\(l+1\)
  3. \(Q=P\)
  4. \(i\)\(r-1\)下降到\(1\)执行:
    4.1. \(Q=[2]Q\)
    4.2. 若\(h_i=1\),且\(k_i=0\),则\(Q=Q+P\)
    4.3. 若\(h_i=0\),且\(k_i=1\),则\(Q=Q-P\)
  5. 输出\(Q\)

算法三:滑动窗法
输入:点\(P\)\(l\)比特的整数\( k = {\sum\limits_{j = 0}^{l - 1}{k_{j}2^{j}}}\)\(k_j∈\{0,1\}\)
输出:\(Q=[k]P\)
设窗口长度\(r>1\)
预计算

  1. \(P_1=P\)\(P_2=[2]P\)
  2. \(i\)\(1\)\(2^{r-1}-1\)计算\(P_{2i+1}=P_{2i-1}+P_2\)
  3. \(j=l-1\)\(Q=O\)

主循环

  1. \(j≥0\)执行:
    4.1. 若\(k_j=0\),则\(Q=[2]Q\)\(j=j-1\)
    4.2. 否则
     4.2.1. 令\(t\)是使\(j-t+1≤r\)\(k_t=1\)的最小整数;
     4.2.2. \( h_{j} = {\sum\limits_{i = 0}^{j - t}{k_{t + i}2^{i}}}\)
     4.2.3. \(Q=[2^{j-t+1}]Q+P_{h_j}\)
     4.2.4. 置\(j=t-1\)
  2. 输出\(Q\)

4 \(F_p\)上椭圆曲线系统参数及其验证
椭圆曲线系统参数是可以公开的,系统的安全性不依赖于对这些参数的保密。
4.1 \(F_p\)上椭圆曲线系统参数
\(F_p\)上椭圆曲线系统参数包括:

  1. 域的规模\(q=p\)\(p\)为大于\(3\)的素数;
  2. (选项)一个长度至少为192的比特串\(SEED\)
  3. \(F_p\)中的两个元素\(a\)\(b\),它们定义椭圆曲线\(E\)的方程:\(y^2=x^3+ax+b\)
  4. 基点\(G=(x_G,y_G )∈E⁡(F_p )\)\(G≠O\)
  5. 基点\(G\)的阶\(n\)(要求:\(n>2^{191}\)\(n>4p^{1⁄2}\));
  6. (选项)余因子\(h=♯⁡E⁡(F_p ) ⁄n\)

4.2 \(F_p\)上椭圆曲线系统参数的验证
椭圆曲线系统参数的生成者应验证下面的条件。椭圆曲线系统参数的用户可以选择验证这些条件。
输入:\(F_p\)上椭圆曲线系统参数的集合。
输出:若椭圆曲线系统参数是有效的,则输出“有效”;否则输出“无效”。

  1. 验证\(q=p\)是奇素数(参见4.3节);
  2. 验证\(a\)\(b\)\(x_G\)\(y_G\)是区间\([0,p-1]\)中的整数;
  3. 若按照4.4节描述的方法拟随机产生椭圆曲线,验证\(SEED\)是长度至少为192的比特串,且\(a\)\(b\)\(SEED\)派生得到;
  4. 验证\((4a^2+27b^2 )\mbox{ mod }p≠0\)
  5. 验证\(y_G^2≡x_G^3+ax_G+b(\mbox{mod }p)\)
  6. 验证n是素数,\(n>2^{191}\)\(n>4p^{1⁄2}\)(参见4.3节);
  7. 验证\([n]G=O\)
  8. (选项)计算\(h'=⌊(p^{1⁄2}+1)^2⁄n⌋\),并验证\(h=h'\)
  9. 验证抗MOV攻击条件和抗异常曲线攻击条件成立(参见4.6.1和4.6.2节);
  10. 若以上任何一个验证失败,则输出“无效”;否则,输出“有效”。

4.3 概率素性检查
\(u\)是一个大的正整数,下面的改了算法(Miller-Rabin检测)将确定\(u\)使素数还是合数。
输入:一个大的奇数\(u\)和一个大的正整数\(T\)
输出:“概率素数”或“合数”。

  1. 计算\(v\)和奇数\(w\),使得\(u-1=2^v⋅w\)
  2. \(j\)\(1\)\(T\)执行:
    2.1. 在区间\([2,u-1]\)中选取随机数\(a\)
    2.2. 置\(b=a^w\mbox{ mod }u\)
    2.3. 若\(b=1\)\(u-1\),转到步骤2.6;
    2.4. 对\(i\)\(1\)\(v-1\)执行:
     2.4.1. 置\(b=b^2\mbox{ mod }u\)
     2.4.2. 若\(b=u-1\),转到步骤2.6;
     2.4.3. 若\(b=1\),输出“合数”并终止;
     2.4.4. 下一个\(i\)
    2.5. 输出“合数”,并终止;
    2.6. 下一个\(j\)
  3. 输出“概率素数”。

若算法输出“合数”,则\(u\)是一个合数。若算法输出“概率素数”,在\(u\)是合数的概率小于\(2^{-2T}\)。这样,通过选取足够大的\(T\),误差可以忽略。

4.4 \(F_p\)上椭圆曲线系统参数的拟随机生成
方式1:
输入:素域的规模\(p\)
输出:比特串\(SEED\)\(F_p\)中的元素\(a\)\(b\)

  1. 任意选择长度至少为192的比特串\(SEED\)
  2. 计算\(H=H_{256}⁡(SEED)\),并记\(H=(h_{255},h_{254},…,h_0 )\)
  3. \(R = {\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\)
  4. \(r=R\mbox{ mod }p\)
  5. 任意选择\(F_p\)的元素\(a\)\(b\),使\(r⋅b^2≡a^3 (\mbox{mod }p)\)
  6. \((4a^2+27b^2 )\mbox{ mod }p≠0\),则转步骤1;
  7. 所选择的\(F_p\)上的椭圆曲线为\(E:y^2=x^3+ax+b\)
  8. 输出\((SEED,a,b)\)

方式2:
输入:素域的规模\(p\)
输出:比特串\(SEED\)\(F_p\)中的元素\(a\)\(b\)

  1. 任意选择长度至少为192的比特串\(SEED\)
  2. 计算\(H=H_{256}⁡(SEED)\),并记\(H=(h_{255},h_{254},…,h_0 )\)
  3. \(R = {\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\)
  4. \(r=R\mbox{ mod }p\)
  5. \(b=r\)
  6. \(F_p\)中的元素\(a\)为某固定值;
  7. \((4a^2+27b^2 )\mbox{ mod }p≠0\),则转步骤1;
  8. 所选择的\(F_p\)上的椭圆曲线为\(E:y^2=x^3+ax+b\)
  9. 输出\((SEED,a,b)\)

4.5 \(F_p\)上椭圆曲线系统参数拟随机生成的验证
方式1
输入:比特串\(SEED\)\(F_p\)中的元素\(a\)\(b\)
输出:输入参数“有效”或“无效”。

  1. 计算\(H'=H_{256}⁡(SEED)\),并记\(H'=(h_{255},h_{254},…,h_0 )\)
  2. \(R'={\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\)
  3. \(r'=R'\mbox{ mod }p\)
  4. \(r'⋅b^2≡a^3(\mbox{mod }p)\),则输出“有效”;否则输出“无效”。

方式2
输入:比特串\(SEED\)\(F_p\)中的元素\(a\)\(b\)
输出:输入参数“有效”或“无效”。

  1. 计算\(H'=H_{256}⁡(SEED)\),并记\(H'=(h_{255},h_{254},…,h_0 )\)
  2. \(R'={\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\)
  3. \(r'=R'\mbox{ mod }p\)
  4. \(r'=b\),则输出“有效”;否则输出“无效”。

4.6 安全椭圆曲线满足的条件
4.6.1 抗MOV攻击条件
A. Menezes、T. Okamoto、S. Vanstone、G. Frey和H. Rück的约化攻击将有限域\(F_q\)上的椭圆曲线离散对数问题约化为\(F_{q^B}\)\(B>1\))上的离散对数问题。这个攻击方法只有在\(B\)较小时是实用的,大多数椭圆曲线不符合这种情况。抗MOV攻击条件确保一条椭圆曲线不易受此约化方法攻击。多数\(F_q\)上的椭圆曲线确实满足抗MOV攻击条件。
在验证抗MOV攻击条件之前,必须选择一个MOV阈,它是使得求取\(F_{q^B}\)上的离散对数问题至少与求取\(F_q\)上的椭圆曲线离散对数问题同样难的一个正整数\(B\)。对于\(q>2^{191}\)的标准,要求{B≥27}。选择\(B≥27\)也限制了对非超奇异椭圆曲线的选取。
下述算法用于验证椭圆曲线系统参数是否满足抗MOV攻击条件。
输入:MOV阈\(B\),素数幂\(q\)和素数\(n\)\(n\)\(♯⁡E⁡(F_q )\) 的素因子,其中\(E⁡(F_q )\)\(F_q\)上的椭圆曲线)。
输出:若\(F_q\)上包含\(n\)阶基点的椭圆曲线满足抗MOV攻击条件,则输出“正确”;否则输出“错误”。

  1. \(t=1\)
  2. \(i\)\(1\)\(B\)执行:
    2.1. 置\(t=(t⋅q)\mbox{ mod }n\)
    2.2. 若\(t=1\),则输出“错误”并结束;
  3. 输出“正确”。

4.6.2 抗异常曲线攻击条件
\(E⁡(F_p )\)为定义在素域\(F_p\)上的椭圆曲线,若\(♯⁡E⁡(F_p ) =p\),则称椭圆曲线\(E⁡(F_p )\)为异常曲线。N. Smart、T. Satoh和K. Araki证明可在多项式时间内求解异常曲线的离散对数。抗异常曲线攻击条件为\(♯⁡E⁡(F_p ) ≠p\),满足此条件确保椭圆曲线不受异常曲线攻击。\(F_p\)上的绝大多数椭圆曲线确实满足抗异常曲线攻击条件。
下述是否用于验证椭圆曲线系统参数是否满足抗异常曲线攻击条件。
输入:\(F_p\)上的椭圆曲线\(E⁡(F_p )\),阶\(N=♯⁡E⁡(F_p )\)
输出:若\(E⁡(F_p )\)满足抗异常曲线攻击条件,则输出消息“正确”;否则输出消息“错误”。

  1. \(N=p\),则输出“错误”;否则输出“正确”。

5 密钥对的生成与公钥的验证
5.1 密钥对的生成
输入:一个有效的\(F_q\)\(q=p\)\(p\)为大于\(3\)的素数)上椭圆曲线系统参数的集合。
输出:与椭圆曲线系统参数相关的一个密钥对\((d,P)\)

  1. 用随机数发生器产生整数\(d∈[2,n-2]\)
  2. \(G\)为基点,计算点\(P=(x_P,y_P )=[d]G\);
  3. 密钥对是\((d,P)\),其中\(d\)为私钥,\(P\)为公钥。

5.2 \(F_p\)上椭圆曲线公钥的验证
输入:一个有效的\(F_p\)\(p\)为大于\(3\)的素数)上椭圆曲线系统参数集合及一个相关的公钥\(P\)
输出:对于给定的椭圆曲线系统参数,若公钥P是有效的,则输出“有效”;否则输出“无效”。

  1. 验证\(P\)不是无穷远点\(O\)
  2. 验证公钥\(P\)的坐标\(x_P\)\(y_P\)是域\(F_p\)中的元素(即验证\(x_P\)\(y_P\)是区间\([0,p-1]\)中的整数);
  3. 验证\(y_P^2≡x_P^3+ax_P+b(\mbox{mod }p)\)
  4. 验证\([n]P=O\)
  5. 若通过了所有验证,则输出“有效”;否则输出“无效”。

6 曲线示例:\(F_p\)上椭圆曲线
椭圆曲线方程为:\(y^2=x^3+ax+b\)
示例1:\(F_p\)-192曲线

素数$p$: BDB6F4FE 3E8B1D9E 0DA8C0D4 6F4C318C EFE4AFE3 B6B8551F
系数$a$: BB8E5E8F BC115E13 9FE6A814 FE48AAA6 F0ADA1AA 5DF91985
系数$b$: 1854BEBD C31B21B7 AEFC80AB 0ECD10D5 B1B3308E 6DBF11C1
基点$G=(x,y)$,其阶记为$n$。
坐标$x$: 4AD5F704 8DE709AD 51236DE6 5E4D4B48 2C836DC6 E4106640
坐标$y$: 02BB3A02 D4AAADAC AE24817A 4CA3A1B0 14B52704 32DB27D2
阶$n$: BDB6F4FE 3E8B1D9E 0DA8C0D4 0FC96219 5DFAE76F 56564677

示例2:\(F_p\)-256曲线

素数$p$: 8542D69E 4C044F18 BF6FF7DE 6F4C318C 45728391 5C45517D 722EDB8B 08F1DFC3
系数$a$: 787968B4 FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498
系数$b$: 63E4C6D3 B23B0C84 9CF84241 484BFE48 F61D59A5 B16BA06E 6E12D1DA 27C5249A
基点$G=(x,y)$,其阶记为$n$。
坐标$x$: 421DEBD6 1B62EAB6 746434EB C3CC315E 32220B3B ADD50BDC 4C4E6C14 7FEDD43D
坐标$y$: 0680512B CBB42C07 D47349D2 153B70C4 E5D7FDFC BFA36EA1 A85841B9 E46E09A2
阶$n$: 8542D69E 4C044F18 E8B92435 BF6FF7DD 29772063 0485628D 5AE74EE7 C32E79B7

7 SM2椭圆曲线公钥密码算法的参数定义
SM2使用素数域256位椭圆曲线。
椭圆曲线方程:\(y^2=x^3+ax+b\)
曲线参数:

$p=$ FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
$a=$ FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
$b=$ 28E9FA9E D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
$n=$ FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
$x_G=$ 32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
$y_G=$ BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0


参考
GM/T 0003.1—2012
GM/T 0003.5—2012

posted @ 2024-10-22 16:30  Miro'  阅读(52)  评论(0编辑  收藏  举报