主页 > 怎么把imtoken转到平台 > 神奇!原来比特币背后还有这么有趣的数学原理

神奇!原来比特币背后还有这么有趣的数学原理

怎么把imtoken转到平台 2023-07-10 05:16:28

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

>>>>

传统上,“拥有”某物——如房地产或金钱——意味着该物品要么由个人保管,要么委托给银行等可信赖的实体。

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

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

“拥有”比特币仅仅意味着能够将控制权转移给其他人——通过在区块链中创建转移记录。 但是这个能力是如何保证的呢? 通过一个 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与自身相加a次。 例如:

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 = n in O)

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

在比特币系统中:

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

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

基点 = 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A685B F419 4F81B0D0

序列 = 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

“同点加倍”计算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) 模 67

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

c = 12 / 44 模 67

在这里,我们不得不停下来玩点小把戏:当结果必须始终为整数时,如何对有限域进行除法? 我们要用倒数来做乘法,这里篇幅不够就不多解释了(如果对此感兴趣,建议参考这里和这里)。 此时此刻,请先相信我们的计算:

44-1 = 32

下面继续:

c = 12 * 32 模 67

c = 384 模 67

比特币诈骗立案流程_火币网比特币充值流程_比特币流程

c = 49

RX = (492 – 2 * 2) 模 67

RX = (2401 – 4) 模 67

RX = 2397 模 67

RX = 52

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

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

ry = (-2450 – 22) 模 67

ry = -2472 模 67

里 = 7

可以看出我们的公钥对应的点是(52, 7)。 这些就是一个值为2的私钥所需要的操作!

从私钥到公钥的计算比尝试从公钥导出私钥更容易计算。 在椭圆曲线加密的实际应用中,由于使用了较大的值作为参数,理论上可以通过公钥推导出私钥,但在计算上并不可行。

因此,从私钥中获取公钥是一种单程设计。

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

用私钥签名

现在我们有了私钥和公钥对,让我们签署一些数据吧!

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

1、选择一个1到n-1之间的整数k;

2. 用标量乘法计算point(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步中,如果计算结果中有分数(实际计算中总是出现),分子要乘以分母的倒数。 在步骤1中,在进行不同的签名时,必须注意使用的k值不能重复,也不能被第三方猜到。 也就是说,k 值要么是随机数,要么是使用确定性方法生成的,以防止第三方窃取秘密。 否则,从步骤 4 中提取私钥,因为 s、z、r、k 和 n 都是已知的。 您可以在此处阅读有关此类过去的利用的信息。

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

z = 17(数据)

n = 79(顺序)

火币网比特币充值流程_比特币诈骗立案流程_比特币流程

G = (2, 22)(基点)

d = 2(私钥)

1.选择一个随机数:

k = 随机数 (1, n – 1)

k = 随机数 (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 模 n

r = 62 模 79

r = 62

4.计算s:

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

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

s = (17 + 124) / 3 模 79

s = 141 / 3 模 79

s = 47 模 79

小号 = 47

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

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

比特币流程_火币网比特币充值流程_比特币诈骗立案流程

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

s = (17 + 124) / 3 模 79

s = 141 / 3 模 79

s = 141 * 3-1 模 79

s = 141 * 53 模 79

s = 7473 模 79

小号 = 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;

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