有限域上的椭圆曲线长什么样?
我们很容易想象平滑的椭圆曲线,但是有限域上的椭圆曲线看起来究竟是什么样的呢?
下面是 $y^{2} = x^{3} + 3 \pmod {23}$ 的图像:

y^2 = x^3 + 3 (mod 23) 的散点图,只有离散的整数点
因为我们只允许输入整数(更准确地说,是有限域元素),所以我们不会得到一个平滑的图像。
在解方程时,并非每个 $x$ 值都能得出一个整数的 $y$ 值,因此在这些 $x$ 值处不会有对应的点。你可以从上面的图像中看到这些空白。
生成该图像的代码将在稍后提供。
以下是分别在模 11、23、31 和 41 下绘制的 $y^{2} = x^{3} + 3$ 的图像。模数越大,包含的点就越多,图像看起来也越复杂。

模 11 与模 23 下 y^2 = x^3 + 3 的图像

模 31 与模 41 下 y^2 = x^3 + 3 的图像
我们在上一篇文章中已经确定,通过“连线并翻转”操作,椭圆曲线上的点构成了一个群(group)。当我们在有限域上进行此操作时,它仍然是一个群,但它变成了一个循环群(cyclic group),这在我们的应用中非常有用。不幸的是,解释它为什么是循环群需要非常复杂的数学知识,所以你现在只需接受这一点即可。但这并不应该太令人惊讶。我们有有限数量的点,因此通过执行 $(x + 1)G, (x + 2)G, … (x + \text{order} - 1)G$ 来生成每个点至少看起来是合理的。
<aside> 💡 💡 一句话理解『循环群』:想象一个 12 小时的钟面,你每次只往前拨固定的格数,拨着拨着就能走遍所有刻度,最后又回到起点。有限域上的椭圆曲线点也是这样——挑一个『生成元』点 $G$,不停地把它和自己相加($G,2G,3G,\dots$),就能把曲线上所有的点都数出来,数到头还会绕回 $G$。这种『一个起点 + 不断重复同一动作 = 遍历全体』的结构,就叫循环群。
</aside>
在密码学应用中, $p$ 需要非常大。在实践中,它通常超过 200 位。我们将在后面的章节中再次探讨这一点。
在本文中,我们会经常提到“域元素”(field element),希望通过之前的教程(尤其是关于 有限域 的教程),你已经对这个术语感到熟悉了。如果还不熟悉,你可以把它理解为一个在模运算范围内的正整数。
也就是说,如果我们进行模 11 的加法运算,那么该集合中的有限域元素就是 $\set{0,1,…,9,10}$ 。即使那是我们在 Python 示例中将使用的数据类型,称其为“整数”(integers)也是不准确的。在对素数进行模加法时,不可能存在负的域元素(尽管整数可以是负数)。有限域中的“负数”仅仅是另一个数的加法逆元(additive inverse),即两个数相加结果为零的数。例如,在模 11 的有限域中,4 可以被视为“-7”,因为 $7 + 4 \pmod {11}$ 等于 $0$ ,这就类似于常规数字中 7 + (-7) 等于 0。
在有理数域上,乘法的单位元是 1,一个数的逆元仅仅是分子和分母的翻转。例如,500/303 是 303/500 的逆元,因为如果将它们相乘,你会得到 1。
在有限域中,一个元素的逆元是与之相乘能得到有限域元素 1 的数字。例如,在模 23 下,6 是 4 的逆元,因为在模 23 的情况下将它们相乘,你会得到 1。当域的阶(order)为素数时,除了零之外的每个数都有逆元。