主页 > imtoken钱包官方下载最新版 > 中本聪对比特币加密算法的看法

中本聪对比特币加密算法的看法

这段时间,加密货币一词频频出现在各大门户网站的财经版块。 说到数字货币的加密,很多人对中本聪发明的比特币所涉及的加密算法非常感兴趣。 那么今天我们就来了解一下中本聪是如何评价比特币使用的加密算法的。

说到开源协议,比特币的独特之处之一是它的协议极难调整。 与其他协议可以在瞬间添加、修改或丢弃功能不同,在比特币世界中,即使是最细微的变化也需要整个比特币网络的绝大多数人同时合作。 原因很简单:比特币世界,而且只有比特币世界,需要完全的共识。 在 HTML 和 CSS 等 Internet 协议中,如果 Web 浏览器错误地解析了某些样式元素,则可能发生的最坏情况是页面呈现不正确。 在比特币中,单笔交易被误判为有效或无效将使整个区块无效,并可能导致整个网络一分为二,就像 2013 年 3 月发生的那样。因此,我们坚持中本聪在2008年,虽然中本聪的选择绝对不完美,但幸运的是他往往是对的多于错的; 事实上,有几次我们因为中本聪的选择而得到了更好的结果,而更好的结果的原因可能是中本聪自己没有想到的。

比特币地址是公钥的哈希值

比特币的一个有趣方面(最初可能会让很多人感到困惑)是私钥和比特币地址之间的精确关系。 您将交易发送到“比特币地址”,并声明花费的交易需要由相应的“私钥”签名。 但是这两个值之间的关系是什么? 在普通的公钥签名系统中,步骤如下:

有一种算法可以生成由公钥和私钥组成的密钥对,私钥可用于生成消息的签名,公钥可用于验证该签名。 这有什么意义呢? 一般来说,私钥的持有者想要证明他们亲自编写或授权了特定消息。 如果私钥持有者以外的人试图创建签名,则相应公钥的验证将失败。 如果消息在传输过程中被修改比特币采用的加密,验证也会失败。 人们可以看到如何在比特币这样的货币中使用这种机制:每个人都发布他们的公钥,从 A 发送到 B 需要 A 使用他的私钥签署一条消息,其中包括 B 的公钥。 由此,协议可以推断出 A 想要向 B 发送一笔钱。

然而,比特币要复杂得多。 比特币地址不是公钥,而是公钥的哈希值。 散列是一种函数,它可以将任何东西作为输入并产生基本上无法逆转的固定长度输出。 也就是说,给定一个消息M,很容易计算出M的哈希值(hash(M)),但是给定hash(M)去寻找M,是世界毁灭之前做不到的事情。 比特币的私钥和地址的关系如下:

那么交易是如何运作的呢? 除了有关交易本身的明显信息外,比特币交易还包括两部分:支出者的公钥和用支出者的私钥制作的签名。 验证这笔交易的任何人都需要检查:(1)这个公钥的哈希值是花费者的地址; (2) 签名可以用公钥验证。 总而言之,这些交易是由所有者本人(或授权的其他人)使用与消费者地址对应的私钥进行的。

这其中的意义出奇地平凡:在比特币使用的椭圆曲线数字签名算法加密系统中,公钥有 512 位长,这意味着它需要将近 100 个字符来呈现。 例如,以下是公钥:

04b52fd5a616a8f08cca​​d58469102f86fc7891e5aa4262ab8d43e41767c17d45b

80850044a62af51783609176daf02fc46221057a8de11ee6ae8743065b27a4b5e

同时,其对应的十六进制形式的比特币地址如下:

4b463093e6fc3135a4de2ff577c4b658198777a9

更熟悉的 base58 编码形式是:

1obodiqhAZ3GD9onBXRZ9v7hshkuBreCu

然而,在现实中,。 最后发现有办法把公钥编码成更紧凑的形式,只需要257字节(译者注:这里好像有问题,应该是257位,见这篇文章):

03c5c9833d00bed3211a5f3733316ecf6ebc407806d70caa14862f1e2e8c2f852d

如果我们决定将其转换为 base58 编码形式:

15sqRCowBDTfyuxPQD3ba8sN3wBB8MwGbo6gsBEGeKmUbNQADGh

不会比我们今天使用的地址长多少。 那么中本聪的选择是否只是带来了不必要的复杂性和浪费呢? 事实证明,答案是否定的。 使用这种“公钥散列”地址结构还有另一个很好的理由:量子密码学。 量子计算机可以破解椭圆曲线数字签名算法(即给定一个公钥,量子计算机可以相当快地找到对应的私钥),但不能类似地逆向哈希算法(或者可以,但需要280步才能破解)一个比特币地址,这仍然是非常不可行的)。 因此,如果你的比特币资金存储在一个你没有花费过的地址中(意味着公钥不是公开的),它们在量子计算机中也是安全的,至少在你花费它们之前是这样。 有理论上的途径可以使比特币完全免受量子计算机的威胁,但地址只是公钥的哈希这一事实意味着一旦量子计算机出现,攻击者可能会在我们完全切换之前造成问题。 损失要小得多。

2100万总币种上限

比特币的一个有争议的属性是它的固定供应。 目前,每 10 分钟铸造 25 个新比特币,这个数字每 4 年减半。 总的来说,存在的比特币永远不会超过 2100 万个。 另一方面,每个比特币可以分为 1 亿股(每股称为 1“satoshi”)。 如果一分钱够买车,用美元交易会很麻烦,但即使比特币升值,即使是上面假设的美元情况,我们也不会遇到这样的问题。 因此,总而言之,将永远存在的货币单位总数为 2,100,000,000,000,000,即 2100 万亿,即 250.899。 中本聪选择这个值比大多数人意识到的要幸运或聪明得多。 首先,这个数远小于264-1,后者是计算机能够以标准整数形式存储的最大整数。 如果超过该值,该值将像里程表一样归零。

其次,还有一个更小的阈值,即中本聪的总数试图低于:可以用浮点格式表示的最大可能整数。 整数不是计算机可以存储的唯一类型的数字。 为了处理小数,计算机使用一种进行浮点表示的格式。 浮点数本质上是科学记数法的二进制版本。 例如,这是您在学习物理时会遇到的一个值:

地球质量:5.972 * 1024 kg

太阳质量:1.989 * 1030 kg

光速:2.998 * 108 m/s

一光年:9.460 * 1015 m

质子质量:1.672 * 10-27 kg

普朗克长度:1.616 * 10-35 m

我们可以注意到科学记数法如何让您以合理的精度表示所有这些数字,即使它们的大小差异很大。 浮点数本质上是二进制科学记数法; 当你存储数字 9.625 时,你的计算机存储“1.001101 * 1011”(或者更确切地说,它存储 01000000 00100011 01000000 00000000 00000000 00000000 00000000 000000 这与高精度序列形式相同)。 在这种高精度形式下,系数(即不是指数的部分)有52位(52bits)。 这意味着高精度(更准确地说是“双精度”)浮点数足以存储高达 253 的数字,但不能超过 253,并且您会在最后开始砍掉数字。 比特币的 250.9 聪总数,以指数形式表示,刚好低于这个最大值。

如果我们有整数比特币采用的加密,为什么还要关心浮点数呢? 因为更多的高级编程语言(比如Javascript)并不开放低级的“浮点数”和“整数表示法”,而只是给程序成员提供“数”的概念——当然是以浮点。 如果中本聪选择 2.1 亿而不是 2100 万的价值,比特币用多种语言编程会比现在麻烦得多。

请注意,不幸的是,Stefan Thomas 在编写 BitcoinJS 时没有及时注意到这一点,因此该库使用专门的“大数字”对象而不是普通数字来存储教程输出值; 由我自己分叉当前的 BitcoinJS(添加了其他改进)使用普通数字。

选择正确的椭圆曲线

椭圆曲线密码术不是一种单一的标准化消息加密方法。 事实上有许多不同的“曲线”可供选择。 要了解不同的“曲线”是什么,首先对椭圆曲线密码学背后的数学有一个基本的了解会很有帮助。 一般来说,椭圆曲线由方程 y2 = x3 + ax + b 上的一系列点 (x, y) 组成(a 和 b 是曲线的参数)。 这是一个椭圆曲线:

椭圆曲线加密算法依赖于曲线上称为“点加”和“点乘”的操作,下图可以很好地解释这一点:

简单地说,要添加两个点 P 和 Q,在两点之间画一条线,找到该线与曲线相交的第三个点,并从该点画一条垂直线得到你的答案。 然而,这些曲线有一个弱点:它们不精确。 如果多次做加法运算,浮点数舍入误差会慢慢累积,最终结果会变成无意义的噪音。 因此,椭圆曲线密码学采用了两处修改的椭圆曲线。 首先,方程现在是 y2 = x3 + ax + b + kp,其中 k 可以是任何整数,p 是一个大素数(a 和 b 的曲线参数除外)。 其次,x 和 y 必须是整数。 虽然最终的结果算不上是“曲线”,但在数学上已经足够了,并且限于整数,以避免四舍五入造成的偏差。

可以使用许多不同的曲线参数; SEC2 文件提供了一个标准文件。 然而,一般来说,曲线分为两类:“伪随机”曲线和 Koblitz 曲线。 在伪随机曲线中,参数a和b是通过特定算法(本质上是哈希运算)从某个“种子”中选出的。 对于secp256r1(标准的256位伪随机曲线),其“种子”为c49d360886e704936a6678e1139d26b7819f7e90,得到的参数为:

p = 115792089210356248762697446949407573530086143415290314195533631308867097853951

一 = 115792089210356248762697446949407573530086143415290314195533631308867097853948

b = 41058363725152142129326129780047268409114441015993725554835256314039467401291

一个明显的问题:种子从哪里来? 为什么种子不是其他看似更简单的数字,比如 15? 最近有关美国国家安全局颠覆加密标准的揭露中最重要的一点之一就是,选择种子以某种方式软化曲线,这种方式只有美国国家安全局知道。 值得庆幸的是,回旋余地不是无限的。 由于哈希函数的性质,NSA 无法找到“弱”曲线然后确定种子; 唯一的攻击路径是尝试不同的种子,直到最终产生“弱”曲线。 如果 NSA 知道只影响一条特定曲线的椭圆曲线漏洞,伪随机数参数生成过程将阻止他们将该漏洞推广到其他曲线。 但是,如果他们发现了一个共同的漏洞,那么该过程就无法提供保护。 我们都知道,c49d360886e704936a6678e1139d26b7819f7e90有潜力成为美国国家标准技术研究院尝试的第10亿颗种子。

幸运的是,比特币不使用伪随机曲线; 比特币使用 Koblitz 曲线。 比特币的secp256k1参数如下:

p = 115792089237316195423570985008687907853269984665640564039457584007908834671663

一 = 0

b = 7

就是这样。 甚至 p 也很容易计算出来; 它只是 2256 - 232 - 977(公平地说,p 和 a 在 secp256r1 中也相当简单;它的问题是 b)。 这些参数的简单性给 NSA 和 NIST 留下了很小的空间来制作一条险恶的曲线。 并且出于安全和效率的考虑,甚至采用了0、7、977这些数值。 当高效密码学标准组现任主席丹·布朗被问及这个问题时,他回答说:“我不知道比特币正在使用 secp256k1。事实上,我很惊讶有人会使用 secp256k1 而不是secp256r1。“如果 secp256r1 事实上被破解,那么比特币就真的躲过了一劫,因为比特币是少数使用 secp256k1 而不是 secp256r1 的程序之一。

以上就是微风小编今天为大家带来的中本聪对比特币加密算法的看法内容。 世人除了知道他发明了比特币外,对中本聪知之甚少,但今天我们对他的了解多了一点,因为它表达了自己对加密算法的看法。 虽然太过专业,但也是大家愿意看到的。