主页 > imtoken如何安装 > 太棒了!原来比特币背后有这么一个有趣的数学原理

太棒了!原来比特币背后有这么一个有趣的数学原理

imtoken如何安装 2023-01-17 00:24:59

比特币系统可能让新手感到困惑的原因之一是其背后的技术重塑了“所有权”的概念。

>>>>

传统上,“拥有”某物 - 例如房地产或金钱 - 意味着它要么由个人保管,要么委托给受信任的实体(如银行)保管。

比特币系统并非如此。比特币本身既不是集中存储也不是本地存储,因此没有一个实体是它的保管人。

比特币作为记录存储在称为“区块链”的分类账中,其副本在互连计算机的志愿网络之间共享。

“拥有”比特币仅仅意味着有能力将控制权转移给其他人——通过在区块链中创建转移记录。但如何保证这种能力?通过 ECDSA 私钥、公钥密钥对。这是什么意思?如何保证比特币系统的安全?

让我们掀开盖子,看看下面是什么。

神奇!原来比特币背后蕴含着这样有趣的数学原理

ECDSA 是椭圆曲线数字签名算法的首字母缩写。它是使用椭圆曲线和有限域对数据进行“签名”的过程。这样,第三方可以验证签名的真实性,同时允许签名者保留创建签名的专有能力。在比特币系统中,“签名”的数据是指转让所有权的交易。 ECDSA 将签名过程和验证过程分开。每个过程都是由几个算术运算组成的算法。签名算法使用私钥,验证算法使用公钥。稍后我们将演示一个示例。

但首先是关于椭圆曲线和有限域的速成课程。

椭圆曲线

椭圆曲线的代数表示如下:

y2 = x3 + ax + b

其中,a = 0,b = 7(比特币系统使用的版本),其图形如下:

神奇!原来比特币背后蕴含着这样有趣的数学原理

椭圆曲线有一些有用的特性。例如一个比特币对应一个密钥吗,如果一条非垂直线与一条椭圆曲线在两点相交,如果这两个点都不相切,那么曲线上必定有第三个点与这条线相交。另一个特点是通过曲线上任意点的非垂直切线必须与曲线有一个且只有一个交点。

利用这些特性,我们可以定义两种操作:“不同点的加法”和“相同点的加倍”。 (译者注:使用切线规则来定义加法运算)

“附加点加法”,P+Q=R,定义为:R为R'基于x轴的反射点(对称点)。其中 R' 是包含 P 和 Q 的直线与曲线的第三个交点。用图形最容易理解:

神奇!原来比特币背后蕴含着这样有趣的数学原理

同理,“双同点”,P+P=R,定义为:通过点P做切线一个比特币对应一个密钥吗,先找到切线与曲线的另一个交点R',然后计算反射点R R' 基于 x 轴。

神奇!原来比特币背后蕴含着这样有趣的数学原理

结合这两个操作可用于标量乘法,R = a P,定义为将点 P 与自身相加一次。例如:

R = 7P

R = P + (P + (P + (P + (P + (P + P))))))

标量乘法的运算过程可以通过“异点加法”和“同点加倍”的组合来简化。例如:

R = 7P

R = P + 6P

一个比特币对应一个密钥吗

R = P + 2 (3P)

R = P + 2 (P + 2P)

这里,7P被分解为两步“同点加倍”和两步“异点加法”。

有限域

ECDSA中的一个有限域可以理解为一个预定义的正数区间,因此每次运算的结果都必须包含在这个区间内(译者注:对上面定义的加法运算是封闭的)。区间外的任何数字都被“包裹”以使其落入区间内。

实现这一点的最简单方法是找到余数,这是使用模运算 (mod) 完成的。例如,9/7 的结果是商 1 加 2:

9 模 7 = 2

这里,我们的有限域是模7,所有的模运算,都会得到一个落在0到6区间的结果。

组合使用

ECDSA 使用的椭圆曲线是基于有限域的,它极大地改变了曲线的外观,而不是改变曲线所基于的方程或特殊性质。使用与上面相同的方程,在模数为 67 的有限域中绘制时看起来像这样:

神奇!原来比特币背后蕴含着这样有趣的数学原理

现在变成了所有x和y值都是0到66之间的整数的点的集合。注意这个“曲线”保持水平对称。

“添加不同点”和“双重相同点”在视觉上略有不同。图表上绘制的线是水平和垂直环绕,保持与游戏“小行星”中相同的斜率。因此,(2, 22)和(6, 25)“不同点相加”)的图如下:

神奇!原来比特币背后蕴含着这样有趣的数学原理

第三个交点是(47, 39),它的反射点是(47, 28)。(译者注:28 = 67 - 39)

回到 ECDSA 和比特币

比特币等协议为椭圆曲线及其有限域选择一组参数,协议下所有用户使用的参数是固定的。这组参数包括使用的方程、有限域的素数模、落在曲线“基点”(G)上的一个点。基点的“阶数”(n)不是单独选择的,它与其他参数形成一个函数,在图上,可以想象为“基点”重复添加到自身直到斜率的次数切线的长度是无限的(或变成粗线)。 (译者注:“阶”的算术表达式为nG = O n)

比特币系统将一些非常大的数字设置为“基点”、素数模数和“阶数”。事实上,所有实际的 ECDSA 都使用非常大的数字。基于这些值的算法安全性是如此之高,以至于试图对它们进行暴力破解或逆向工程是不切实际的。

在比特币中:

椭圆曲线方程:y2 = x3 + 7

素数模数 = 2256 – 232 – 29 – 28 – 27 – 26 – 24 – 1 = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F

基地 = 04 79BE667E F9DCBBAC 55A06295 CE870B 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9DBFB1

序次= FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141

谁选择了这些数字,为什么这样选?毕竟,一个巨大的、看似随机的数字有可能隐藏一个后门来重建私钥。简而言之,这个名为 secp256k1 的特定实现是密码学中使用的基于有限域椭圆曲线的解决方案家族的成员。

私钥和公钥

抛开这些规则,现在是了解私钥、公钥及其关系的时候了。简要回顾一下:在 ECDSA 中,私钥是介于 1 和以不可预测的方式选择的“顺序”之间的数字。公钥是通过“基点”和等于私钥的值的标量乘法从私钥计算出来的。计算公式为:

公钥=私钥×基点

一个比特币对应一个密钥吗

这表示私钥的最大可能值(也是比特币地址的数量)等于“顺序”。

在连续域上,我们可以画切线并绘制公钥,但有些公式可以在有限域上做同样的工作。 p+q“不同点相加”求分量表示的r的计算公式如下:

c = (qy – py) / (qx – px)

rx = c2 - px - qx

ry = c (px – rx) – py

p“双同点”r的公式如下:

c = (3px2 + a) / 2py

rx = c2 – 2px

ry = c (px – rx) – py

在实际计算中,公钥的计算分解为从“基点”开始的一系列“双相同”和“加不同”操作。

让我们以一个小数字为例来演示底层操作,以便直观地了解密钥是如何构造和用于签名和验证的。我们使用的参数是:

方程:y2 = x3 + 7(即:a = 0, b = 7)

素数的模数:67

基点:(2, 22)

订单:79

私钥:2

首先,找到公钥。由于我们选择了最简单的值为2的私钥,所以我们只需要对“基点”进行“同点加倍”操作即可。计算过程如下:

c = (3 * 22 + 0) / (2 * 22) mod 67

c = (3 * 4) / (44) mod 67

c = 12 / 44 mod 67

在这里,我们必须停下来做一些事情:当结果必须始终为整数时,如何在有限域中进行除法?我们必须使用倒数来做乘法,但是这里没有足够的篇幅来解释它(如果你有兴趣,建议参考这里和这里)。目前,请继续相信我们的计算:

44-1 = 32

继续往下:

c = 12 * 32 mod 67

c = 384 mod 67

c = 49

rx = (492 – 2 * 2) mod 67

一个比特币对应一个密钥吗

rx = (2401 – 4) mod 67

rx = 2397 mod 67

p>

rx = 52

ry = (49 * (2 – 52) – 22) mod 67

ry = (49 * (-50) – 22) mod 67

ry = (-2450 – 22) mod 67

ry = -2472 mod 67

ry = 7

可以看出我们的公钥对应的点是(52, 7)。上面是一个值为2的私钥。从私钥到公钥计算比尝试更容易从公钥导出私钥。实际应用中的椭圆曲线加密使用大数作为参数导出私钥理论上可行,但计算上不切实际。

因此,从私钥中获取公钥是一种设计上的单向旅行。

使用私钥 同样,公钥通常表示为一串十六进制数字。但是等等,我们如何将平面上由两个数字表示的点变成一个数字呢?在未压缩的公钥中,表示 x 和 y 坐标的两个 256 位数字粘合在一起以产生一个长字符串。我们还可以使用椭圆曲线的对称性来生成压缩格式的公钥,只保留 x 值来指示该点在曲线的哪一侧。从这部分数据中,我们可以恢复两个坐标轴的坐标。

用私钥签名

现在我们有了私钥和公钥对,对一些数据进行签名!

数据可以是任意长度。通常第一步是对数据进行哈希处理以生成一个与曲线的数字“顺序”相同的数字(256)。为简洁起见,我们省略了哈希处理步骤,只对原始数据进行签名z .我们用G表示“基点”,n表示“顺序”,d表示私钥,签名方法如下:

1。选择一个介于 1 和 n-1 之间的整数 k ;

2。通过标量乘法计算点 (x, y) = k × G;

3. 令 r = x mod n。如果 r = 0,则返回第 1 步;

4. 让 s = (z + r × d) / k mod n。如果s = 0,则返回步骤1;

5。 (r , s) 是签名。

需要提醒的是,在第4步中,如果计算结果中出现分数(在实际计算中总会出现),分子要乘以分母的倒数。第一步,在进行不同的签名时,必须注意使用的k值不能重复,也不能被第三方猜到。也就是说,k值要么是随机数,要么是防止第三方窃取机密的值。确定性生成方法。否则,将从步骤 4 中提取私钥,因为 s、z、r、k 和 n 都是已知的。您可以在此处了解过去的此类漏洞。

我们选择数字17作为要签名的数据,按照下面的方法计算。变量如下:

z = 17(数据)

n = 79(顺序)

G = (2, 22) (基点)

d = 2(私钥)

1。选择一个随机数:

一个比特币对应一个密钥吗

k = rand(1, n – 1)

k = rand(1, 79 – 1)

k = 3("这真的是随机的吗?我读书不多,别骗我!" "好吧,你明白了,但是这个数字让我们的例子更容易!")

2。计算点。这与先前确定公钥的方法相同。为简洁起见,我们省略了“同点加倍”和“异点加法”的算术计算。

(x, y) = 3G

(x, y) = G + 2G

(x, y) = (2, 22) + (52, 7)

(x, y) = (62, 63)

x = 62

y = 63

3。计算r。

r = x mod n

r = 62 mod 79

r = 62

4.计算s:

s = (z + r × d) / k mod n

s = (17 + 62 × 2) / 3 mod 79

s = (17 + 124) / 3 mod 79

p>

s = 141 / 3 mod 79

s = 47 mod 79

s = 47

注意上面的计算可以除以3,结果是整数。在实际计算中,我们需要用到k的逆(和之前一样,我们隐藏了一些恶心的计算细节):

s = (z + r * d) / k mod n

s = (17 + 62 * 2) / 3 mod 79

s = (17 + 124) / 3 mod 79

s = 141 / 3 mod 79

一个比特币对应一个密钥吗

s = 141 * 3-1 mod 79

s = 141 * 53 mod 79

s = 7473 mod 79

p>

s = 47

5. 我们的签名是 (r, s) = (62, 47).

用私钥和公钥一样,签名通常用十六进制字符串表示。

使用公钥验证签名

现在我们有了数据和该数据的签名。拥有我们公钥的第三方可以接收此数据和签名,并可以验证我们是发送者。让我们看看它是如何工作的。

公钥用 Q 表示,其他变量同上,验证签名的步骤如下:

1.验证r和s在1到n-1之间;

2. 计算 w = s mod n ;

3. 计算 u = z × w mod n ;

4. 计算 v = r × w mod n ;

4. 计算 v = r × w mod n ;

p>

5. 计算点 (x, y) = uG + vQ ;

6. 验证 r = x mod n。如果等式不成立,则签名无效。

为什么这些步骤有效?我们省略了证明过程,但您可以在此处阅读更多详细信息。

按照上面的方法,让我们看看验证过程是如何工作的。变量如下:

z = 17(数据)

(r, s) = (62, 47) (签名)

n = 79(顺序)

G = (2, 22) (基础)

Q = (52, 7) (公钥)

1. 验证 r 和 s 在 1 和 n-1 之间。

检查,再检查

r: 1