椭圆曲线

在有限域上构造的椭圆曲线是密码学的另一个重要工具。

椭圆曲线就是一个密码,即:该群上的离散对数问题是困难的。

有许多种定义椭圆方程的方法,就我们而言,我们做如下定义, 是一个巨大的域 (255-bit),有方程 其中 是一个常数, 是它的解,其所有解组成一个集合,我们就称该集合就是在椭圆曲线 上的 -有理点集。 这些坐标 就被称为“仿射坐标”。-有理点集中的所有点与“无穷远点” 就组成了一个群,其中 就是该群的单位元。通常椭圆曲线群用加法来表示。

"共线三点的和是 , 也就是无穷远点。"

群加法法则很简单:两个点相加,就是找到过两个点的直线并与椭圆曲线相交于第三个点,并将该点的 坐标取相反数。 自己加自己,也就是二倍点运算,需要进行一些特殊处理:我们求出直线在该点的正切值,进而求出该直线交椭圆曲线的另一点,然后再取逆。 反之,若一个点与它的逆元相加,结果就是无穷远点。

通过点加和二倍点运算,我们很自然就能计算点的标量乘法,即点乘以一个整数,这些整数就被称为 标量。 椭圆曲线点的个数就是群的阶。如果这个阶是个素数 ,于是所有的标量就可以视为 标量域 中的元素。

精心设计的椭圆曲线有一个很重要的安全性质。假定 上的两个随机元素,找到一个 使得 , 也就是求解关于 的对应于 的离散对数,在当前经典计算机上,是计算不可能的。这就是椭圆曲线的离散对数假设。

如果椭圆曲线群 的阶是素数 (正如我们在 Halo 2 中所使用的), 则它是一个有限循环群。由上一节 可知,这就是说这个椭圆曲线群与 是同构的, 等价地,与scalar域 是同构的。同构由生成元 固定, 进而scalar中的元素就是由 产生的一个群元素的离散对数。在密码学安全的椭圆曲线下,即便同构,也很难在 这种情况下计算,因为椭圆曲线上的离散对数问题是困难的。

有时利用这种同构性质是很有帮助的,方式是在scalars上思考基于群的密码学的协议或者算法,而不是在群元素上。 这会使得证明和表示更加简单。 举例来说,现在在有关证明系统的论文中已经普遍采用 来代表一个有着离散对数 的群元素,显然这种表示中已经隐去了生成元。

我们也如下课题中采用了此一思想, "distinct-x theorem", 用来证明 for elliptic curve scalar multiplication中优化的正确性 以及原始 Halo paper 附录C中所提及的基于同态的优化。

椭圆曲线算术

二倍点运算

求点 倍是最简单的情况。继续我们前文的例子,设椭圆曲线是 , 所以第一步计算就是求如下导数:

为了得到计算 的公式,考虑

为了得到 的公式,将 带入椭圆曲线方程:

通过比较 项的系数,我们就得到了

射影坐标

上面计算中有求 的逆元的计算,而求逆运算是十分昂贵的。我们可以通过对椭圆曲线方程进行变换来“推迟”求逆运算, 因为通常在一个单独的曲线运算之后,通常并不马上就要得到相关结果的仿射坐标 。基于此一想法,我们引入第三个坐标 并在方程两边同乘以 。如下所示:

特别的,我们最开始的椭圆曲线就是 的情况。令仿射坐标点 可以表示成以下方式 , and ,则我们就得到了一条同态射影曲线

转成 是很简单的,只需要在当 时计算 。 (当 时,它就是一个无穷远点 )。在该种表示形式下,计算二倍点时所需要的求逆运算就被推迟了。 一个通常的方法是将 表示成 ,转换方程使得分母相同,进一步使结果点 也有一样的分母,使得

射影坐标只是在大多数时候,但是并不总是比仿射坐标效率更好。当我们采用不同的方式运用蒙哥马利小技巧, 或者在我们的电路设置中乘法和求逆复杂度形同的情况下(至少是电路规模),就绝非如此。

以下,就给出了基于 的二倍点的计算方法,该方法就是不用求逆的。代入 可得:

进一步得出

注意我们是如何让 的分母相同的。综上所述,我们通过令 ,并随之令 , 就用射影坐标 的二倍点计算完全替代了直接求仿射坐标 二倍点的计算。通过这种方式, 我们完全避免了在仿射坐标二倍点的计算中所必需的求逆运算,此一方法也会运用到两个不同点的加法中去。

点加

现在计算两个不同点的加法, 其中 得到 直线 的斜率是

通过 的表达式,我们可以计算 -坐标,即 为:

把直线 的方程带入曲线方程 可得

比较 的系数,可知 .


重要提示:

  • 对于无边界情况的点加,存在一个高效的公式1 (所谓的“完全”公式),该公式统一了 点加和二倍点的计算。使用该公式计算一个点和它的逆的加法,将得到 ,也就意味着无穷远点。

  • 另外,还有其他的计算模型,比如雅可比表示形式,即:,相比于 ,这是由乘以 的变换得到的。该表示有更好的算术性能,但是却没有一个统一的抑或是完全的公式。

  • 在两个同质化的射影坐标空间中,我们可以很方便地比较两个曲线上的点 是否相等。方法就是“同一化”他们的 Z-坐标,所以比较两个点是否是同一个点,只需检验如下等式是否成立: 并且

椭圆曲线自同态

假设 有三次本原单位根,或者说 ,所以就存在一个元素 ,其能够产生一个 -阶乘法子群。 注意,在示例椭圆曲线 上的点 有两个相关的点:,因为通过计算 都能有效 消除 -坐标的 组成部分。建立映射 就是在曲线上建立了一个自同态映射。这里所涉及到的精确 机制是很复杂的,但是当一条曲线有素数 个点(因而它的阶也是素数),自同态的作用就是对一个点乘以 上的一个标量,相当于在标量域上乘上三次本原单位根

椭圆曲线点压缩

给定曲线上一个点 ,它的逆 也在曲线上。 为了唯一表示该点,我们可以仅将其 -坐标和 -坐标的符号进行编码即可。

序列化

正如在 Fields 这一节所提到的,我们可以将一个域元素的最低位作为其“符号”。 因为它的加法逆元总是有相反的最低位。所以我们就把 -坐标的最低为作为其“符号”。

Pallas 和 Vesta 是定义在域 和域 上的,二者的元素都是 bits。 它的表示需要32个字节,同时还会剩余一个bit。于是,我们就将 -坐标的 符号位 放入 -坐标的最高位即可:

         <----------------------------------- x --------------------------------->
Enc(P) = [_ _ _ _ _ _ _ _] [_ _ _ _ _ _ _ _] ... [_ _ _ _ _ _ _ _] [_ _ _ _ _ _ _ sign]
          ^                <------------------------------------->                 ^
         LSB                              30 bytes                                MSB

“无穷远点” 作为群的单位元并没有相应的仿射坐标 表示。但是,可以证明,不论是 Pallas 还是 Vesta 曲线都没有 的点。因此,我们就可以使用“假的”仿射坐标 来代表 ,那么它的实际表示也就是一个全为 的32字节的数组。

反序列化

一个压缩的椭圆曲线的点的放序列化方法是,首先读取最高位作为 y符号,这个符号就是 -坐标的符号。 第二步,将该位设为0以得到真正的 -坐标。

如果 我们就返回一个“无穷远点” 。反之,我们就进一步计算 。 接下来,我们可以读取计算出来的 -坐标的最低位,也就是它的 符号,如果 sign == ysign, 我们就得到了正确的结果,只需将 返回即可。反之,我们就对 取反并返回

曲线循环

是定义在有限域 上的椭圆曲线,其中 是素数,记为 , 并且我们记定义在 上的群 的阶是。对这条曲线,我们称 为“基域”, 为“标量域”。

我们在 实例化我们的证明系统。这允许我们证明关于 算术电路的满足性命题。

(备注) 既然椭圆曲线 是定义在 上,那为什么算术电路却实现在 上? 证明系统基本上就是工作在由标量组成的电路上 (或者,更准确地,标量其实是要承诺的多项式的系数)。 标量就在 上,当它们编码或者承诺的对象是椭圆曲线 上的点。

与之相应,绝大多数验证者的算术运算都是在基域 上的,因此可以用 的算术电路高效的表示。

**(备注)为什么验证计算 (主要) 发生在 上? ** 事实上,Halo 2 对电路的输出做一些群运算。而群运算,就如二倍点和点加就会用到域 上的算术运算, 因为点的坐标都在域 上。

这促使我们构造以 为标量域的另外一条曲线,这条曲线实现一个基于 的算术电路,该电路就可以有效地 来验证来自第一条曲线的证明。更美好的是,如果这条曲线的基域又是 ,那么它生成的证明就又可以被第一条曲线的 算术电路所验证。于是就形成了一个2-曲线循环:

TODO: Pallas-Vesta curves

Reference: https://github.com/zcash/pasta

Hashing到椭圆曲线(??)

有时将某个输入映射到椭圆曲线 上的随机一个点是很有用的,这样,就没人能知道它的离散对数(相对其他基)。

相关细节在 Internet draft on Hashing to Elliptic Curves 中有所描述。 针对效率和安全性,有各种各样的算法完成这个工作。Internet Draft 所使用的框架就运用了多种功能:

  • hash_to_field: 将一个字节序列映射到基域 上的一个元素

  • map_to_curve: 将 上的元素映射到 上。

TODO: Simplified SWU

Reference: https://eprint.iacr.org/2019/403.pdf

References