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\)表示。
- 加法单位元是整数\(0\);
- 乘法单位元是整数\(1\);
- 域元素的加法是整数的模\(p\)加法,即若\(a,b∈F_p\),则\(a+b=(a+b)\mbox{ mod }p\);
- 域元素的乘法是整数的模\(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)\)上的点按照下面的加法运算规则,构成一个交换群:
- \(O+O=O\);
- \(∀P=(x,y)∈E(F_p)\backslash\{O\}\),\(P+O=O+P=P\);
- \(∀P=(x,y)∈E(F_p )\backslash\{O\}\),\(P\)的逆元素\(-P=(x,-y)\),\(P+(-P)=O\);
- 两个非互逆的不同点相加的规则:
点\(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}}\) - 倍点规则:
设\(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 )\)上的点按照下面的加法运算规则,构成一个阿贝尔群:
- \(O+O=O\);
- \(∀P=(x,y)∈E(F_p )\backslash\{O\}\),\(P+O=O+P=P\);
- \(∀P=(x,y)∈E(F_p )\backslash\{O\}\),\(P\)的逆元素\(-P=(x,-y)\),\(P+(-P)=O\);
- 点\(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 )\)上点的加法运算定义如下:
- \(O+O=O\);
- \(∀P=(x,y,z)∈E(F_p )\backslash\{O\}\),\(P+O=O+P=P\);
- \(∀P=(x,y,z)∈E(F_p )\backslash\{O\}\),\(P\)的逆元素\(-P=(ux,-uy,uz)\),\(u∈F_p\)且\(P+(-P)=O\);
- 设点\(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 )\)上点的加法运算定义如下:
- \(O+O=O\);
- \(∀P=(x,y,z)∈E(F_p )\backslash\{O\}\),\(P+O=O+P=P\);
- \(∀P=(x,y,z)∈E(F_p )\backslash\{O\}\),\(P\)的逆元素\(-P=(u^2 x,-u^3 y,uz)\),\(u∈F_p\)且\(P+(-P)=O\);
- 设点\(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\),即
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\)。
- 置\(Q=O\);
- \(j\)从\(l-1\)下降到\(0\)执行:
2.1. \(Q=[2]Q\);
2.2. 若\(k_j=1\),则\(Q=Q+P\); - 输出\(Q\)。
算法二:加减法
输入:点\(P\),\(l\)比特的整数\(
k = {\sum\limits_{j = 0}^{l - 1}{k_{j}2^{j}}}\),\(k_j∈\{0,1\}\)。
输出:\(Q=[k]P\)。
- 设\(3k\)的二进制表示是\(h_r h_{r-1}…h_1 h_0\),其中最高位\(h_r\)为\(1\);
- 设\(k\)的二进制表示是\(k_r k_{r-1}…k_1 k_0\),显然\(r=l\)或\(l+1\);
- 置\(Q=P\);
- 对\(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\); - 输出\(Q\)。
算法三:滑动窗法
输入:点\(P\),\(l\)比特的整数\(
k = {\sum\limits_{j = 0}^{l - 1}{k_{j}2^{j}}}\),\(k_j∈\{0,1\}\)。
输出:\(Q=[k]P\)。
设窗口长度\(r>1\)。
预计算
- \(P_1=P\),\(P_2=[2]P\);
- \(i\)从\(1\)到\(2^{r-1}-1\)计算\(P_{2i+1}=P_{2i-1}+P_2\);
- 置\(j=l-1\),\(Q=O\)。
主循环
- 当\(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\); - 输出\(Q\)。
4 \(F_p\)上椭圆曲线系统参数及其验证
椭圆曲线系统参数是可以公开的,系统的安全性不依赖于对这些参数的保密。
4.1 \(F_p\)上椭圆曲线系统参数
\(F_p\)上椭圆曲线系统参数包括:
- 域的规模\(q=p\),\(p\)为大于\(3\)的素数;
- (选项)一个长度至少为192的比特串\(SEED\);
- \(F_p\)中的两个元素\(a\)和\(b\),它们定义椭圆曲线\(E\)的方程:\(y^2=x^3+ax+b\);
- 基点\(G=(x_G,y_G )∈E(F_p )\),\(G≠O\);
- 基点\(G\)的阶\(n\)(要求:\(n>2^{191}\)且\(n>4p^{1⁄2}\));
- (选项)余因子\(h=♯E(F_p ) ⁄n\)。
4.2 \(F_p\)上椭圆曲线系统参数的验证
椭圆曲线系统参数的生成者应验证下面的条件。椭圆曲线系统参数的用户可以选择验证这些条件。
输入:\(F_p\)上椭圆曲线系统参数的集合。
输出:若椭圆曲线系统参数是有效的,则输出“有效”;否则输出“无效”。
- 验证\(q=p\)是奇素数(参见4.3节);
- 验证\(a\)、\(b\)、\(x_G\)和\(y_G\)是区间\([0,p-1]\)中的整数;
- 若按照4.4节描述的方法拟随机产生椭圆曲线,验证\(SEED\)是长度至少为192的比特串,且\(a\),\(b\)由\(SEED\)派生得到;
- 验证\((4a^2+27b^2 )\mbox{ mod }p≠0\);
- 验证\(y_G^2≡x_G^3+ax_G+b(\mbox{mod }p)\);
- 验证n是素数,\(n>2^{191}\)且\(n>4p^{1⁄2}\)(参见4.3节);
- 验证\([n]G=O\);
- (选项)计算\(h'=⌊(p^{1⁄2}+1)^2⁄n⌋\),并验证\(h=h'\);
- 验证抗MOV攻击条件和抗异常曲线攻击条件成立(参见4.6.1和4.6.2节);
- 若以上任何一个验证失败,则输出“无效”;否则,输出“有效”。
4.3 概率素性检查
\(u\)是一个大的正整数,下面的改了算法(Miller-Rabin检测)将确定\(u\)使素数还是合数。
输入:一个大的奇数\(u\)和一个大的正整数\(T\)。
输出:“概率素数”或“合数”。
- 计算\(v\)和奇数\(w\),使得\(u-1=2^v⋅w\);
- 对\(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\); - 输出“概率素数”。
若算法输出“合数”,则\(u\)是一个合数。若算法输出“概率素数”,在\(u\)是合数的概率小于\(2^{-2T}\)。这样,通过选取足够大的\(T\),误差可以忽略。
4.4 \(F_p\)上椭圆曲线系统参数的拟随机生成
方式1:
输入:素域的规模\(p\)。
输出:比特串\(SEED\)及\(F_p\)中的元素\(a\),\(b\)。
- 任意选择长度至少为192的比特串\(SEED\);
- 计算\(H=H_{256}(SEED)\),并记\(H=(h_{255},h_{254},…,h_0 )\);
- 置\(R = {\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\);
- 置\(r=R\mbox{ mod }p\);
- 任意选择\(F_p\)的元素\(a\)和\(b\),使\(r⋅b^2≡a^3 (\mbox{mod }p)\);
- 若\((4a^2+27b^2 )\mbox{ mod }p≠0\),则转步骤1;
- 所选择的\(F_p\)上的椭圆曲线为\(E:y^2=x^3+ax+b\);
- 输出\((SEED,a,b)\)。
方式2:
输入:素域的规模\(p\)。
输出:比特串\(SEED\)及\(F_p\)中的元素\(a\),\(b\)。
- 任意选择长度至少为192的比特串\(SEED\);
- 计算\(H=H_{256}(SEED)\),并记\(H=(h_{255},h_{254},…,h_0 )\);
- 置\(R = {\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\);
- 置\(r=R\mbox{ mod }p\);
- 置\(b=r\);
- 取\(F_p\)中的元素\(a\)为某固定值;
- 若\((4a^2+27b^2 )\mbox{ mod }p≠0\),则转步骤1;
- 所选择的\(F_p\)上的椭圆曲线为\(E:y^2=x^3+ax+b\);
- 输出\((SEED,a,b)\)。
4.5 \(F_p\)上椭圆曲线系统参数拟随机生成的验证
方式1
输入:比特串\(SEED\)及\(F_p\)中的元素\(a\),\(b\)。
输出:输入参数“有效”或“无效”。
- 计算\(H'=H_{256}(SEED)\),并记\(H'=(h_{255},h_{254},…,h_0 )\);
- 置\(R'={\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\);
- 置\(r'=R'\mbox{ mod }p\);
- 若\(r'⋅b^2≡a^3(\mbox{mod }p)\),则输出“有效”;否则输出“无效”。
方式2
输入:比特串\(SEED\)及\(F_p\)中的元素\(a\),\(b\)。
输出:输入参数“有效”或“无效”。
- 计算\(H'=H_{256}(SEED)\),并记\(H'=(h_{255},h_{254},…,h_0 )\);
- 置\(R'={\sum\limits_{i = 0}^{255}{h_{i}2^{i}}}\);
- 置\(r'=R'\mbox{ mod }p\);
- 若\(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攻击条件,则输出“正确”;否则输出“错误”。
- 置\(t=1\);
- 对\(i\)从\(1\)到\(B\)执行:
2.1. 置\(t=(t⋅q)\mbox{ mod }n\);
2.2. 若\(t=1\),则输出“错误”并结束; - 输出“正确”。
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 )\)满足抗异常曲线攻击条件,则输出消息“正确”;否则输出消息“错误”。
- 若\(N=p\),则输出“错误”;否则输出“正确”。
5 密钥对的生成与公钥的验证
5.1 密钥对的生成
输入:一个有效的\(F_q\)(\(q=p\)且\(p\)为大于\(3\)的素数)上椭圆曲线系统参数的集合。
输出:与椭圆曲线系统参数相关的一个密钥对\((d,P)\)。
- 用随机数发生器产生整数\(d∈[2,n-2]\);
- \(G\)为基点,计算点\(P=(x_P,y_P )=[d]G\);
- 密钥对是\((d,P)\),其中\(d\)为私钥,\(P\)为公钥。
5.2 \(F_p\)上椭圆曲线公钥的验证
输入:一个有效的\(F_p\)(\(p\)为大于\(3\)的素数)上椭圆曲线系统参数集合及一个相关的公钥\(P\)。
输出:对于给定的椭圆曲线系统参数,若公钥P是有效的,则输出“有效”;否则输出“无效”。
- 验证\(P\)不是无穷远点\(O\);
- 验证公钥\(P\)的坐标\(x_P\)和\(y_P\)是域\(F_p\)中的元素(即验证\(x_P\)和\(y_P\)是区间\([0,p-1]\)中的整数);
- 验证\(y_P^2≡x_P^3+ax_P+b(\mbox{mod }p)\);
- 验证\([n]P=O\);
- 若通过了所有验证,则输出“有效”;否则输出“无效”。
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 |
坐标$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 |
坐标$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