主页 > 老版本imtoken > Craig Wright 亲自破译了比特币密钥验证过程

Craig Wright 亲自破译了比特币密钥验证过程

老版本imtoken 2023-04-15 07:24:21

“使用让-保罗·萨特签名与使用诺贝尔奖得主让-保罗·萨特签名不同。

-Jean-Paul Sartre, 1964” 我记得很多年前读到这句话,从那以后就觉得很不舒服。但是很多年后回想起来,经历了这些年的风风雨雨,我的内心感到一种平静。使用 Craig Wright 签名的含义不同于使用 Craig Wright 和 Satoshi Nakamoto 签名的含义。

虽然我知道这是真的,但我的内心并不希望它如此。 IFdyaWdodCwgaXQgaXMgbm90IHRoZSBzYW1lIGFzIGlmIEkgc2lnbiBDcmFpZyBXcmlnaHQsIFNh

dG9zaGkuCgo=

QQ截图20160503162433

我已经盯着屏幕看了好几个小时,但仍然找不到合适的词来表达我对那些从一开始就支持比特币的人的深深感谢——太多了,无法一一列举。 这些年来,你牺牲了青春和成果,牺牲了人际关系和休假,但仍在为这个可能不会让你取得任何进展的开源项目而奋斗。 这个社区的热情、智慧和毅力传递了我的贡献,培育了它,拥抱了它,使它栩栩如生。 你给这个世界带来了一份礼物,为此,我对你感激不尽。

你放心,这些年我也没闲着。 从那时起,我在与中本聪形象保持距离后,将全部精力投入到研究中。 我沉默,但从不缺席比特币活动。 我正在与一个特殊的团队合作,并期待在适当的时候分享我们的成果。

中本聪死了。

但这仅仅是开始。

密钥验证

在本文的其余部分,我将解释密钥验证过程。

为了保证我们能够正确使用OpenSSL的椭圆曲线参数成功对消息进行签名和验证,首先需要保证secp256k1曲线加载成功。 这不是 Centos Linux 上的默认设置。 这里我就不细说了。 我应该指出 RPMForge 维护补丁二进制文件。 如果你像我一样使用 Centos,我的建议是从 OpenSSL 网站下载源文件和补丁。

建议读者先阅读以下一些网站:

比特币密钥什么样_比特币区块和比特币的区别_比特币分叉影响比特币总量

第一阶段将解释散列函数。 在下图中,我们显示了一个名为“sn7-message.txt”的文件。

QQ截图20160503152815

上图中呈现的一系列十六进制值表示输入值的 SHA256 哈希值。 一个好的哈希算法会产生一大串无法预先确定的值。 信息量和排列的所有可能性将始终超出可以从任意哈希函数输出的模拟范围,但总会存在冲突。 鉴于目前的技术水平,要找到一组输入值与相同输出值发生冲突的哈希函数是不可行的,而这正是确保哈希函数(如 SHA256)的实用性和安全性的原因。

SHA256 算法提供的最大信息量为 (2^128−1) 位,同时返回 32 字节或 256 位作为输出值。 可以输入 SHA256 哈希函数的信息量是 (2 ^128−1)! 可能的输入值范围从 0 位到我们可以接受的最大值,如上所示。

在确定可能的碰撞范围时,我们有一个二项式系数 ( n ),它通过组合学确定排列。

我将在以后的文章中更详细地介绍冲突检测的数学原理。 需要指出的是,虽然每个哈希都有数量惊人的碰撞值,但是找到两个碰撞值或者预先决定它们的概率是无穷小的。

哈希

哈希函数比较简单,可以手工完成。 当然,这掩盖了哈希函数逆向的复杂性。 好的散列函数简单易用,反之则不然。 下图显示了正在运行的 Linux 哈希程序“sha256sum”。 该程序返回对应于一组固定输入的特殊值。

QQ截图20160503152842

上面,我们在几个文件上运行了程序,我们在 OpenSSL 签名中使用了其中一个。 这个特殊的文件叫做萨特。 文件内容如下图所示:

比特币密钥什么样_比特币分叉影响比特币总量_比特币区块和比特币的区别

QQ截图20160503152850

数字签名算法对消息的散列进行签名。 虽然也可以对信息进行签名,但是如果对哈希进行签名,则可以保证信息的完整性,验证信息是否发生了变化。 即使更改了空格或句点,哈希值也会与原始返回值根本不同。

为了写入这个值并将其保存到文件中,我们可以使用 Linux 命令 xxd。 这会将 ASCII 值写入十六进制二进制文件。 输入以下命令,我们可以在名为“file.name”的文件中写入一串0。

echo '000...000' | xxd -r -p > file.name

为此,我们可以将接收到的字符串作为哈希算法的输出更改为十六进制编码的文件。 我们可以签署并验证此信息。 验证您添加到上面 echo 命令的字符串很重要。 如果输入错误的单个数字,则无法验证该消息。

公钥

为了验证数字签名的消息,我们需要很多条件,包括:

•算法

• 我们希望验证的签名者的公钥

• 签名信息

• 对文档进行数字签名

第一部分,需要的算法可以通过安装合并了secp256k1曲线补丁的OpenSSL获得。 上述步骤还包括创建哈希消息。 下一部分涉及使用 ECDSA 公钥。

QQ截图20160503152900

比特币区块和比特币的区别_比特币分叉影响比特币总量_比特币密钥什么样

对于此步骤,我使用存储在 OpenSSL 中的 PEM 文件中的公私密钥对,David Derosa 编写了一个很好的页面来定义 OpenSS 椭圆曲线密钥对的创建。 在上图中,您可以看到与消息签名中使用的密钥对密切相关的特定 PEM 格式公钥。 详细阅读 David 的页面将为读者提供有关如何将比特币交易中使用的私钥格式化为 PEM 文件的所有详细信息。 此页面详细介绍了新私钥的创建,但未详细介绍如何将现有私钥导入 OpenSSL。 我将介绍这个额外的过程,并演示如何将基于椭圆曲线加密的现有私钥对导入 ASN.1 格式,以便直接与 OpenSSL 一起使用。

导出公钥的命令如下:openssl ec -in sn-pub.pem -pubin -text -noout

0411db93e1dcdb8a016b49840f8c53

bc1eb68a382e97b1482ecad7b148a6

909a5cb2e0eaddfb84ccf9744464f8

2e160bfa9b8b64f9d4c03f999b8643

f656b412a3

这些返回字符串是程序使用的公钥值,包括比特币签名函数的验证和寻址。

Casascius 开发了一种工具,可以帮助您解码公钥并返回相关的比特币地址,

符号

使用 OpenSSL 对消息进行数字签名的过程要求签署消息的一方有权访问私钥。 这几天,我用了10个比特币地址相关的私钥。 这些已经加载到 SPV 钱包 Electrum 中,我在其中签署了一些不是我选择的信息,而是其他人选择的信息。 在某些情况下,我们通过下载新版本的 Electrum 来确保流程的完整性。

我运行的 electrum 版本是 Centos Linux v7,通过 Python。

签名验证

比特币密钥什么样_比特币区块和比特币的区别_比特币分叉影响比特币总量

最后一步是签名。 我们将使用以下命令将 base64 签名转换为可以加载到 OpenSSL 中的文件格式。

>> base64 --decode 签名 > sig.asn1 & openssl dgst -verify sn-pub.pem -signature sig.asn1 sn7-message.txt

我们要验证的签名文件包含以下数据:

----------------------签名文件------------------------ --

MEUCIQDBKn1Uly8m0UyzETObUSL4wYdBfd4ejvtoQfVcNCIK4AIgZmMsXNQWHvo6KDd2Tu6euEl1

3VTC3ihl6XUlhcU+fM4=

---------------------- 结束签名------------------------ ---

如下图所示,我们展示了签名文件比特币密钥什么样,在保存文件的时候,可以使用Vim等编辑程序,将编码后的签名剪切粘贴到保存的文件中。

QQ截图20160503152911

一些脚本

为了简化程序,我包含了两个 shell 脚本文件。 对于这些脚本的变体,请访问 Enrico Zimuel 等网站,该网站并不特别关注椭圆曲线密码学,但更新代码以将其用于基于比特币的系统并不困难。

符号

我在下面包含了签名脚本,因此您可以在闲暇时对其进行测试。使用此脚本,输入包括可用于指示您希望使用所选

比特币分叉影响比特币总量_比特币区块和比特币的区别_比特币密钥什么样

要签名的文档。在该命令中,

该变量表示一个文件,其中包含用于签署消息的私钥。

EcDSA.Sign.sh  

QQ截图20160503152919

核实

我们可以使用类似的过程来验证我们创建的签名,使用以下脚本。

EcDSA.Verify.sh   

在此命令行中,变量代表我们要验证的文件的名称。 该变量表示我们保存签名的文件(使用 Base64 编码).last 变量

包含 PEM 格式的公钥。 这些文件可以一起使用,如果都有效且正确,则可以成功验证数字签名。

QQ截图20160503152927

选择格式

比特币使用的签名格式是基于 DER 编码的。 在过去 7 年中,应用于原始代码的其他方法发生了巨大变化。 选择对签名和其他信息使用 DER 编码是基于希望确保信息可以在不兼容的系统之间共享。 这不是存储信息的最有效方式比特币密钥什么样,但它确实允许不同的系统进行有效通信。

与许多开源项目一样,OpenSSL 在许多领域的文档很少。 比特币寻址和密钥对的存储本来可以更有效,并且已更新代码以确保这一点。

安全一直是一种风险功能,而不是绝对的。