双线性配对(有时也称为双线性映射)允许我们取三个数 $a$ 、 $b$ 和 $c$ (其中 $ab = c$ ),将它们加密为 $E(a)$ 、 $E(b)$ 、 $E(c)$ (其中 $E$ 是加密函数),然后将这两个加密值发送给验证者,验证者可以验证 $E(a)E(b) = E(c)$ ,但无法知道原始值。我们可以使用双线性配对来证明第三个数是前两个数的乘积,而无需知道前两个原始数字。

<aside> 💡 💡 打个比方:你把两个数 $a$ 和 $b$ 锁进两个不透明的保险箱 $E(a)$、$E(b)$,别人看不到里面装了几。但双线性配对就像一台神奇的『验钞机』,它能隔着箱子核对——『这两箱的内容相乘,是不是正好等于第三箱 $E(c)$ 里的数?』比如 $a=3$、$b=8$、$c=24$,机器只回答『对得上』或『对不上』,却始终不知道里面是 3、8、24。这就是它的魔法:能验证乘法关系,又不泄露原始数字。

</aside>

我们将在高层次上解释双线性配对,并在 Python 中提供一些示例。

先决条件

即使没有完全理解上述所有内容,也可以阅读本教程,但要对该主题建立良好的直觉会比较困难。

双线性配对是如何工作的

当一个标量乘以椭圆曲线上的一个点时,会产生另一个椭圆曲线点。即 $P = pG$ ,其中 $p$ 是标量, $G$ 是生成元。给定 $P$ 和 $G$ ,我们无法确定 $p$ 。

假设 $pq = r$ 。我们要尝试做的是取

$$ \begin{align*} P = pG\\ Q = qG\\ R = rG\\ \end{align*} $$

<aside> 💡 💡 一句话理解:$pG$ 就是把生成元 $G$ 这个『积木块』摞 $p$ 层。$p=3$ 就摞 3 层得到 $P$,$q=8$ 就摞 8 层得到 $Q$。妙处在于:你看到一座 3 层高的塔 $P$,却没法反推出它是『一块 $G$ 摞了 3 次』还是别的组合——这就是『加密』,原始的 $p$ 被藏起来了。我们手上有 $P$、$Q$、$R$ 三座塔,要证明前两座的『层数』相乘等于第三座的层数。

</aside>

并向验证者证明 $P$ 和 $Q$ 的离散对数相乘会产生 $R$ 的离散对数。

如果 $pq = r$ ,且 $P = pG$ 、 $Q = qG$ 、 $R = rG$ ,那么我们希望存在一个函数,使得

$$ f(P,Q)=R $$

<aside> 💡 💡 这里在许愿:我们希望有这么一个函数 $f$,喂给它 $P$ 和 $Q$ 两座塔,它能吐出第三座塔 $R$——但前提是底层的层数真的满足 $pq=r$。如果有人作弊、层数对不上,$f(P,Q)$ 就吐不出 $R$。换句话说,$f$ 是个『隔着保险箱验乘法』的检验员,只在乘法成立时才点头。

</aside>

且在 $pq ≠ r$ 时不等于 $R$ 。对于群中 $p$ 、 $q$ 和 $r$ 的所有可能组合,这都应该成立。

然而,这通常不是我们在使用双线性配对时表达 $R$ 的方式。出于稍后我们将讨论的原因,它通常计算为