AlexiaChen.github.io icon indicating copy to clipboard operation
AlexiaChen.github.io copied to clipboard

椭圆曲线的参数

Open AlexiaChen opened this issue 4 years ago • 0 comments

设椭圆曲线E是定义在有限域$\mathbb{F}_p$上的椭圆曲线,其中$a,b ∈ Fp$, 其中p是大素数,且 $p \thinspace \not = 2, p\thinspace \not = 3$

$$E: y^2=x^3+a*x+b \thinspace (\thinspace mod\thinspace p\thinspace ) $$

椭圆曲线G点的阶

G点的阶就是 如果 $r*G = O$ , 那么r的最小值就是G点的阶,一般这个r是个素数,也就是一个素阶群,换个说法,r就是这个素阶群的点的个数

椭圆曲线的cofactor:

因为整个椭圆曲线是一个点群,那么椭圆曲线这个群的阶设为n,也就是椭圆曲线上点的个数。那么cofactor就定义为h = n/r。 换句话说就是我们平常密码学上接触到的椭圆曲线上的公私钥生成是在一个有限循环群中的循环子群里面做的。

  • 当cofactor等于1的时候,那么 n = r,也就是G点的阶是在整个曲线的阶上,这时候这个子群与曲线上的整个群等价,群元素的数量相等。比如secp256k1 secp256r1的cofactor都是1。

  • 当cofactor不等于1的时候,那么 n > r, 也就是说,这时候这个素阶子群是整个曲线的真子集。所以这种情况下,椭圆曲线下的某些点是不在这个循环子群中的,而这些点的阶,不是子群阶的正整数倍。比如Curve25519/ Edwards 25519中的cofactor就是8, 所以在用Curve25519做DH秘钥交换的时候,DH交换的私钥就需要选择8的倍数,所以从实现上来看,你就可以看到在Ed25519签名中,生成秘钥对的阶段,私钥的3个最低有效位(least significant bits )都被设置为0,这样就是8的倍数的标量了。这样通过G点的标量乘法生成的点就是在这个子群上了。这种cofactor不为1的情况会导致一些安全问题,所以Edwards 25519就在https://ristretto.group/why_ristretto.html 上选择了一个素阶群。详细链接也可以戳这里 https://tools.ietf.org/pdf/draft-hdevalence-cfrg-ristretto-01.pdf

References

AlexiaChen avatar Jan 15 '21 04:01 AlexiaChen