椭圆曲线配对是各种构造背后的关键密码原语之一,包括确定性阈值签名,zk-SNARK和其他更简单形式的零知识证明。 椭圆曲线配对(或“双线性图”)是使用椭圆曲线进行加密应用(包括加密和数字签名)已有30年历史的最新成果。 配对引入了一种“加密乘法”形式,极大地扩展了基于椭圆曲线的协议的功能。 本文的目的是详细介绍椭圆曲线配对,并解释其工作原理的概述。
椭圆曲线本身是一个不容易理解的话题,本文通常假定您知道它们是如何工作的。 如果您不这样做。 作为简要的总结,椭圆曲线密码学涉及称为“点”的数学对象(这些点是具有(x,y)坐标的文字二维点),并具有用于添加和减去它们的特殊公式(即,用于计算R = P + Q),您也可以将一个点乘以整数(即P * n = P + P +…+ P,但是如果n大的话,有一种更快的计算方法)。
存在一个特殊的点,称为“无穷大点”(O),在点算术中等于零。 P + O = P总是这样。此外,曲线具有“顺序”;存在一个数字n,使得任何P都为P * n = O(当然,P *(n + 1)= P,P *(7 * n + 5)= P * 5,依此类推)。也有一些公认的“生成点” G,从某种意义上说,生成点G代表数字1。理论上,曲线上的任何点(O除外)都可以是G;重要的是G是标准化的。
配对更进一步,它们使您可以检查椭圆曲线点上某些更复杂的方程式-例如,如果P = G * p,Q = G * q和R = G * r,则可以检查是否或不是p * q = r,只有P,Q和R作为输入。似乎椭圆曲线的基本安全保证已被破坏,因为关于p的信息只是从知道P而泄漏的,但事实证明泄漏是高度包含的-特别是,决策Diffie Hellman问题很容易,但是计算Diffie Hellman问题(在上面的示例中知道P和Q,计算R = G * p * q)和离散对数问题(从P中恢复p)在计算上仍然不可行(至少在之前是这样)。
查看配对功能的第三种方法,也许对于我们所使用的大多数用例来说,最能说明问题的是,如果您将椭圆曲线点视为单向加密数字(即,encrypt(p) = p * G = P),则传统的椭圆曲线数学使您可以检查数字的线性约束(例如,如果P = G * p,Q = G * q和R = G * r,则检查5 * P + 7 * Q = 11 * R实际上是在检查5 * p + 7 * q = 11 * r),配对使您可以检查二次约束(例如,检查e(P,Q)* e(G,G * 5)= 1确实在检查p * q + 5 = 0)。上升到二次就足以让我们使用确定性阈值签名,二次算术程序和所有其他好东西。
现在,我们上面介绍的这个有趣的e(P,Q)运算符是什么?这是配对。数学家有时也称它为双线性图。这里的“双线性”一词基本上意味着它满足约束条件:
e(P, Q + R) = e(P, Q) * e(P, R)
e(P + S, Q) = e(P, Q) * e(S, Q)
注意+和可以是任意运算符; 当您创建新颖的新型数学对象时,抽象代数并不关心+和的定义,只要它们以通常的方式保持一致即可。 a + b = b + a,(a * b)* c = a (b * c)和(a * c)+(b * c)=(a + b) c。
如果P,Q,R和S是简单数字,那么进行简单配对很容易:我们可以做e(x,y)= 2 ^ xy。 然后,我们可以看到:
e(3, 4+ 5) = 2^(3 * 9) = 2²⁷
e(3, 4) * e(3, 5) = 2^(3 * 4) * 2^(3 * 5) = 2¹² * 2¹⁵ = 2²⁷
但是,这种简单的配对不适合密码术,因为它们处理的对象是简单的整数,并且太容易分析。 整数使除法,计算对数以及进行其他各种计算变得容易。 简单整数没有“公钥”或“单向函数”的概念。 此外,使用上述配对,您可以倒退-知道x和知道e(x,y),您可以简单地计算除法和对数来确定y。 我们希望数学对象尽可能接近“黑匣子”,您可以在其中加,减,乘和除,而无其他操作。 这是椭圆曲线和椭圆曲线配对出现的地方。
事实证明,可以在椭圆曲线点上绘制双线性图,即得出一个函数e(P,Q),其中输入P和Q是椭圆曲线点,而输出就是所谓的F_p²²元素(至少在特定情况下,我们将在此处进行介绍;具体细节取决于曲线的细节,稍后将对此进行详细说明),但是这样做的背后的数学运算非常复杂。
首先,让我们介绍主要字段和扩展字段。如果您假设曲线方程式是使用规则的实数定义的,则本文前面图片中的漂亮椭圆曲线看起来就是这样。但是,如果我们实际上在密码学中使用规则的实数,则可以使用对数“倒退”,并且一切都会中断。此外,实际存储和表示数字所需的空间量可以任意增加。因此,我们改为在质数字段中使用数字。
素数字段由数字集0、1、2 … p-1组成,其中p是素数,各种运算定义如下:
a + b: (a + b) % p
a * b: (a * b) % p
a - b: (a - b) % p
a / b: (a * b^(p-2)) % p
基本上,所有数学运算都是以p为模的(有关模块化数学的介绍,请参见此处)。 除法是一种特殊情况; 通常,3/2不是整数,在这里我们只想处理整数,因此我们尝试查找x使得x * 2 = 3,其中*当然是指上面定义的模乘。 由于费马定理,上面显示的幂运算可以完成这项工作,但是使用扩展的欧几里得算法还有一种更快的方法。 假设p = 7; 这里有一些例子:
2 + 3 = 5 % 7 = 5
4 + 6 = 10 % 7 = 3
2 - 5 = -3 % 7 = 4
6 * 3 = 18 % 7 = 4
3 / 2 = (3 * 2^5) % 7 = 5
5 * 2 = 10 % 7 = 3
如果您进行这种数学运算,您会发现它是完全一致的,并且满足所有常规规则。上面的最后两个示例显示(a / b)* b = a;您还可以看到(a + b)+ c = a +(b + c),(a + b)* c = a * c + b * c,并且您知道并热爱的所有其他高中代数身份也是如此。实际上,在椭圆曲线中,通常在质数域中计算点和方程。
现在,让我们谈谈扩展字段。您可能之前已经看过扩展字段。在数学教科书中遇到的最常见的示例是复数字段,其中实数字段被“扩展”并带有附加元素sqrt(-1)= i。基本上,扩展字段的工作方式是采用一个现有字段,然后“发明”一个新元素并定义该元素与现有元素之间的关系(在这种情况下,i²+ 1 = 0),请确保该等式对于原始字段中的任何数字,并查看原始字段元素和刚刚创建的新元素的所有线性组合的集合。
我们也可以扩展素数字段。 例如,我们可以用i扩展我们上面描述的素数场mod 7,然后我们可以这样做:
(2 + 3i) + (4 + 2i) = 6 + 5i
(5 + 2i) + 3 = 1 + 2i
(6 + 2i) * 2 = 5 + 4i
4i * (2 + i) = 3 + i
最后的结果可能很难确定。 发生的事情是,我们首先将乘积分解为4i * 2 + 4i * i,得到8i-4,然后因为我们正在用mod 7运算而成为i + 3,因此,除法:
a / b: (a * b^(p^2-2)) % p
请注意,费马定理的指数现在是p²而不是p,但是如果我们再次想提高效率,也可以扩展扩展欧几里得算法来完成这项工作。请注意,对于该字段中的任何x,x ^(p²-1)= 1,因此我们将p²-1称为“该字段中乘法组的阶”。
对于实数,代数基本定理可确保我们称为复数的二次扩展是“完整的”-您不能进一步扩展它,因为对于任何数学关系(至少是由代数公式定义的任何数学关系),您可以在一些新元素j和现有的复数之间得出一个结论,有可能至少提出一个已经满足该关系的复数。但是,对于素数场,我们没有这个问题,因此我们可以进一步进行三次扩展(其中一些新元素w与现有场元素之间的数学关系是三次方程,因此1,w和w²都是线性地彼此独立),高阶扩展,扩展的扩展等。椭圆曲线对正是基于这些增压的模复数。