快捷搜索:  汽车  科技

分组密码算法图解(动手计算双线性对)

分组密码算法图解(动手计算双线性对)左侧等于右侧,验证完毕。右侧:x^3 3 mod 101 = 41^3 = 3 mod 101 =42在中篇中,我们也提到数域的扩张会直接影响我们需要讨论的点的多少,那么如果我们对 " F_101 " 进行扩张,是否能够得到更多的循环周期为17的点呢?METASTATE的博客中给出这样一个例子,我们将用这个例子说明这个命题的真假。首先我们选择满足 j^2 mod 17 = 15的j用于对 " F_101 " 的扩张,过程就像我们上一篇文章中进行的那样,扩张后的域记为 “ F_101的二次扩域 ” 。在这个扩张下,我们可以找到另一个循环周期为17的群,下面的表格列出这个群的全部元素:我们随机选择 (66 0 23j) 这个元素来验证其满足曲线方程:左侧:y^2 mod 101 = (23j)^2 mod 101 = 23 × 15 mod 101 =42

分组密码算法图解(动手计算双线性对)(1)

前言

上一篇文章中,我们在 " F_101 " 上找到了17个点满足椭圆曲线方程,他们构成一个循环。那么在 " F_101 " 中元素作为坐标的点中还有没有其他的点也满足方程呢?换句话说,上篇文章列出的17个点是不是就是满足方程的全部的解呢?并非如此,比如可以验证(3 38)也满足椭圆曲线的方程,但是他不是上面17个点中的一个。

另一个子群


实际上,我们甚至可以通过将(6 44)作为生成元来得到一个102个元素的循环群,这个循环群涵盖了曲线在 " F_101 " 上的全部点。但是,曲线在 " F_101 " 上的循环周期为17的循环群却只有中篇列出的一个,也就是说在 " F_101 " 上讨论的话,循环周期为17的点已经被我们全部找到了。

在中篇中,我们也提到数域的扩张会直接影响我们需要讨论的点的多少,那么如果我们对 " F_101 " 进行扩张,是否能够得到更多的循环周期为17的点呢?METASTATE的博客中给出这样一个例子,我们将用这个例子说明这个命题的真假。首先我们选择满足 j^2 mod 17 = 15的j用于对 " F_101 " 的扩张,过程就像我们上一篇文章中进行的那样,扩张后的域记为 “ F_101的二次扩域 ” 。在这个扩张下,我们可以找到另一个循环周期为17的群,下面的表格列出这个群的全部元素:

分组密码算法图解(动手计算双线性对)(2)

我们随机选择 (66 0 23j) 这个元素来验证其满足曲线方程:

左侧:y^2 mod 101 = (23j)^2 mod 101 = 23 × 15 mod 101 =42

右侧:x^3 3 mod 101 = 41^3 = 3 mod 101 =42

左侧等于右侧,验证完毕

在发现通过域扩张后还能找到更多的 17 阶点后,我们不禁会想:

继续对 ” F_101的二次扩域 ” 进行扩张,能否找到更多的 17 阶点呢?

或者是:为了找到全部的 17 阶点,我们需要对 F_101 进行几次扩张呢?

嵌入度其实就是描述这个问题的一个概念。E 是定义在 F_101 上的椭圆曲线,我们已经有一个包含n=17个点的子群,我们称这个子群的嵌入度是满足 17 整除 q^k-1 的最小的k。在这个例子中,k=2。计算嵌入度的价值在于事实证明,当对 F_101 进行扩张以期其上的椭圆曲线包含全部 17 阶点时,最小的扩张次数就等于嵌入度。也就是说在 ” F_101的二次扩域 ” 上,我们已经找到全部的17阶元素。

Millier循环


下面给出计算双线性映射的Millier算法,当计算 e(P Q) 时,该算法根据P的坐标创建一个二元多项式,然后将 P 坐标的 x 和 y 分量带入求值:

分组密码算法图解(动手计算双线性对)(3)

METASTATE的博客中作者已经计算了 e((1 2) (90 82u)) 点的结果为 97 89j 。我们给出另外一个计算的例子,并且稍后通过对比这两个例子的结果说明双线性对的一些属性。

分组密码算法图解(动手计算双线性对)(4)

其中 f_17 是二元的多项式,通过一个称为Millier循环的过程我们可以生成该多项式,这个过程类似于计算指数运算时的mul-and-square操作。但是为了更直观的展示原理,我们选择根据上文定义直接展开计算 f_17 ,这会增加一些计算量。

分组密码算法图解(动手计算双线性对)(5)

因此我们需要计算

分组密码算法图解(动手计算双线性对)(6)

的表达式。通过查询上一篇文章的列表我们可以找出P,±2P,±4P,±8P ±16P的值 其中P=(12,32)=5G:

分组密码算法图解(动手计算双线性对)(7)

接下来我们来计算这些直线的方程:

分组密码算法图解(动手计算双线性对)(8)

这样我们已经可以计算 f_17 的结果:

分组密码算法图解(动手计算双线性对)(9)

最后我们计算 (81 52j)^600

分组密码算法图解(动手计算双线性对)(10)

分组密码算法图解(动手计算双线性对)(11)

完全解决curve101配对问题


实际上,我们可以计算出GT的生成元e(G1 G2),也就是e((1 2) (36 31j)),其值为7 28j。这样我们能够完全掌握GT中全部的元素:

分组密码算法图解(动手计算双线性对)(12)

可以看到GT也是一个循环群,他其实是在 “ F_101的二次扩域 ”上满足方程 x^17 = 1 的17个根。根据该表我们不加以计算就可以知道这个配对的任何一个计算结果,例如 e((12 32) (36 31u))=e(5G1 G2) 因此其值就是上表的第5个元素:93 25j。我们之所以能够完全解决curve101的配对问题,是因为curve101的一系列参数决定其足够简单,而实际零知识证明算法中使用的配对就要复杂很多。例如一些标准中要求其配对曲线的嵌入度至少为12,这意味着GT的元素至少是基础素域的12次扩张!如果其素域特征为常见的256位(比如BN256),那么为了表示一个GT元素就需要256*12/8= 384字节的大小。对于任何一个实际使用的曲线,其计算复杂度和规模都使我们当前绝无可能计算出其映射表,这也是离散对数问题困难的所在。

通过系列文章,我们计算了一个简单的配对曲线,加深了对双线性映射的理解。后续,我们继续使用这个配对曲线来讲解和演示零知识证明中Groth16算法的过程和原理,敬请期待。

分组密码算法图解(动手计算双线性对)(13)

乔沛杨

趣链科技基础平台 区块链底层密码学小组

猜您喜欢: