比特币使用了 secp256k1 标准所定义的一条特殊的椭圆曲线和一系列数学常数。该标准由美国国家标准与技术研究院(NIST)设立。secp256k1 曲线由下述函数定义,该函数可产生一条椭圆曲线:
y2 = (x3 + 7)} over (Fp)或 y2 mod p = (x3 + 7) mod p
上述 mod p(素数 p 取模)表明该曲线是在素数阶 p 的有限域内,也写作 Fp, 其中 p = 2256 – 232 – 29– 28 – 27 – 26 – 24 – 1,这是一个非常大的素数。
因为这条曲线被定义在一个素数阶的有限域内,而不是定义在实数范围,它的函数图像看起来像分散在两个维度上的散点图,因此很难画图表示。不过,其中 的数学原理与实数范围的椭圆曲线相似。作为一个例子,下图显示了在一个小了很多的素数阶 17 的有限域内的椭圆曲线,其形式为网格上的一系列散点。而 secp256k1 的比特币椭圆曲线可以被想象成一个极大的网格上一系列更为复杂的散点。
下面举一个例子,这是 secp256k1 曲线上的点 P,其坐标为(x,y)。可以使用
Python 对其检验:
P =
(55066263022277343669578718895168534326250603453777594175 500187360389116729240,32670510020758816978083085130507043
184471273380659243275938904335757337482424)
Python 3.4.0 (default, Mar 30 2014, 19:23:13)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> p = 115792089237316195423570985008687907853269984665640564039
457584007908834671663
>>> x = 550662630222773436695787188951685343262506034537775941755
00187360389116729240
>>> y = 326705100207588169780830851305070431844712733806592432759
38904335757337482424
>>> (x ** 3 + 7 - y**2) % p 0
在椭圆曲线的数学原理中,有一个点被称为"无穷远点",这大致对应于 0在加法中的作用。计算机中,它有时表示为 X = Y = 0(虽然这不满足椭圆曲线方程,但可作为特殊情况进行检验)。 还有一个 + 运算符,被称为"加法",就像小学数学中的实数相加。给定椭圆曲线上的两个点 P1 和 P2,则椭圆曲线上必定有第三点 P3 = P1 + P2。
几何图形中,该第三点 P3 可以在 P1 和 P2 之间画一条线来确定。这条直线恰好与椭圆曲线上的一点相交。此点记为 P3'=(x,y)。然后,在 x 轴做映射获得P3=(x,-y)。
下面是几个可以解释"无穷远点"之存在需要的特殊情况。 若 P1 和 P2 是同一点,P1 和 P2 间的连线则为点 P1 的切线。曲线上有且只有一个新的点与该切线相交。该切线的斜率可用微分求得。即使限制曲线点为两个整数坐标也可求得斜率!
在某些情况下(即,如果 P1 和 P2 具有相同的 x 值,但不同的 y 值),则切线会完全垂直,在这种情况下,P3 = "无穷远点"。
若 P1 就是"无穷远点",那么其和 P1 + P2= P2。类似地,当 P2 是无穷远点,则 P1+ P2 = P1。这就是把无穷远点类似于 0 的作用。
事实证明,在这里 + 运算符遵守结合律,这意味着(A+B)C = A(B+C)。这就是说我们可以直接不加括号书写 A + B + C,而不至于混淆。
至此,我们已经定义了椭圆加法,为扩展加法下面我们对乘法进行标准定义。给定椭圆曲线上的点 P,如果 k 是整数,则 kP = P + P + P + …+ P(k 次)。注意,k 被有时被混淆而称为"指数"。