为什么比特币 哈希计算地址不直接使用公钥,而需要通过哈希生成

比特币区块浏览器 - Blockchain.info比特币硬件钱包中的密码学
比特币硬件钱包中的密码学
文章来源:乐链网
比特币,硬件钱包,密码学
本文主要内容如下:
关于种子&助记词
什么是哈希算法?有什么性质?
什么是公钥密码?什么是公钥与私钥?
硬件钱包如何用种子生成各种币的钱包的?
分层确定性钱包表示方法与示例
1、关于种子&助记词
什么是种子 | Root&Seed
种子是一串由随机数生成器生成的随机数。这串随机数可以用来生成钱包中不同种币和不同账户的公私钥对,所以只需备份种子就相当于备份您的所有钱包了。由于网络空间存在各种各样的威胁,备份的私钥不接触电脑和手机等设备是最安全的,所以硬件钱包的备份方法是记在纸上。
什么是助记词&| Mnemonic Seed
种子是一串很长的随机数,看起来就是一串十六进制值,不利于人进行记录,所以我们用算法将其转化为一串助记词,人们就可以方便进行记录。助记词的产生过程如图:
不同长度的种子对应的单词数量如下表:
总结一下,就是将种子加上校验信息,每11位进行切分,按照得到的数字查询单词表索引得到单词。我们记录的英文单词是有校验信息的,所以不是随意MS个单词就能得到一个种子哦。以上的算法是可逆的,用记录下的助记词可以轻松得出种子。还记得硬件钱包初始化过程中让您记在纸上的那些英文单词吗?它们就相当于种子哦。
2、关于哈希和公私钥
哈希算法 | Hash Algorithm
密码哈希函数是一类数学函数,可以在有限合理的时间内,将任意长度的消息压缩为固定长度的二进制串,其输出值称为哈希值,也称为散列值。
哈希函数的性质:
1.&&&&& 抗碰撞性
碰撞是与哈希函数相关的重要概念,体现着哈希函数的安全性,所谓碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值。哈希函数的安全性是指在现有的计算资源(包括时间、空间、资金等)下,找到一个碰撞是不可行的。
通俗地说,就是很难找到两个具有相同哈希值的不同消息。消息改变,输出的哈希值一般就会改变,哈希值可以看作消息的指纹。即使消息被略微篡改,这个指纹也会发生很大变化。所以哈希值可以用来做完整性校验。
2.&&&&& 原像不可逆
通俗地说,知道输入值,很容易通过哈希函数计算出哈希值;但知道哈希值,没有办法计算出原来的输入值。
3.&&&&& 难题友好性
难题友好性指的是没有便捷的方法去产生满足特殊要求的哈希值。
3、公钥密码算法
公钥密码算法需要两个密钥:公开密钥和私有密钥,简称公钥和私钥。公钥和私钥是一对,如果用公开密钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是不同的密钥,所以这种算法也叫做非对称密码算法。
区块链中所使用的公钥密码算法是椭圆曲线算法,每个用户拥有一对密钥,一个公开,另一个私有。利用椭圆曲线密码算法,用户可以用自己的私钥对交易进行签名,同时别的用户可以利用签名用户的公钥对签名进行验证。在比特币系统中,用户的公钥也被用来识别不同的用户,构造用户的比特币地址。
有一个很重要的特性,已知私钥通过密码学算法可以求出公钥,但知道公钥没办法反推出私钥。在下面的叙述中用point()表示由私钥求公钥的函数。在数字货币中,只要您能够用您的私钥对交易进行签名,就代表您有权利花出您手中这些币,别人只知道您的公钥,无法得到您的私钥,是没有办法使用您的币的。您可以简单认为您的私钥=您的所有币。硬件钱包就是要保护您的私钥,让它们远离被盗。
种子与公私钥对计算
& &由私钥创建公钥
椭圆曲线公钥创建函数,point(),输入为私钥,输出为公钥,即
point(私钥) == 公钥
& &主拓展公钥与主拓展私钥的生成
根种子为128、256或512位随机数,一般由随机数生成器生成。该根种子是用户唯一需要备份的,由该种子可以创建出用户所有钱包。
该种子经过哈希可以得到512位的哈希值,左右256位分别为主私钥m和主链码,主私钥与链码一起构成主拓展私钥。主公钥M由主私钥通过point()方式产生,主公钥与链码一起构成主拓展公钥。主拓展公钥和主拓展私钥位于分层钱包的最顶层。如图所示:
公钥生成函数的性质
由于point()的工作原理,可以把(父)公钥与一个通过整数值i创建的公钥相结合,得到(子)公钥。子公钥也可以通过point()方式产生,输入为父私钥加上整数i后取模p,用公式描述为
point( (父私钥 + i) % p ) == 父公钥 + point(i) == 子公钥
通过这种方式,只要确定一个整数序列,就可以从父公私钥对产生唯一确定的子公私钥对。如果仅需要子公钥,可以在不接触父私钥的情况下生成所有子公钥。
通过这种子密钥推导操作迭代,子公钥可以用于生成他们自己的子公钥(孙公钥),如下:
point( (子私钥+ i) % p ) == 子公钥 + point(i) == 孙公钥
& &普通的分层确定性密钥推导
普通密钥推导的过程如图所示,
指定不同的索引号,可以从相同的父密钥中创建出不同的子密钥。使用子链码对子密钥重复这个过程可以创建出孙密钥,以此类推,分成结构的密钥就可以创建出来了。
& &加强的分层确定性密钥推导
如果黑客得到了正常的父链码和父公钥,他就可以通过以上方式暴力枚举出所有由它推导出的链码和公钥。如果黑客也获得任何一个子孙的私钥,通过逆向上述普通分层确定性密钥算法,那么父私钥以及它子孙的所有私钥也就都泄露了。由于一个私钥泄露可以导致推导出一串私钥。图片中展示出了黑客的推导过程,红色框部分为黑客获得信息。
所以用户不应该导出链码和私钥到不可信的环境中。当然这种风险可以通过加强分层确定性密钥推导算法来避免。普通子私钥推导和加强子私钥推导的过程如图所示。
在加强子私钥推导中,父拓展公钥(父公钥+父链码)已经不能产生子链码了,子链码的产生需要父私钥的参与。加强拓展私钥就像防火墙一样,防止了上面攻击的发生。
使用普通密钥推导还是使用加强密钥推导是由索引决定的,索引号从0x00到0x7fffffff将产生普通密钥,当索引号从0xxffffffff将产生加强密钥。
& &简化表示方法
为了表述方便,使用撇号’来表示加强密钥,不加撇号为普通密钥,第一个普通密钥(0x00)和第一个加强密钥(0x)都表示为0。
M和m表示密钥类型,M表示主公钥,m表示主私钥。斜杠/表示密钥的层次。例如m/0’/0/122’表示主私钥的第一个加强子私钥的第一个普通子私钥的第123个加强子私钥。
下图是简化表示方法的示意图,虚线代表密钥的推导过程,可以清晰看到加强密钥和普通密钥的区别。
每个层次代表的含义
m / purpose' / coin_type' / account' / change / address_index
purpose为加强推导,为固定常数44’
coin_type为加强推导,代表币的种类,具体见附录。
account为加强推导,代表账户
change为普通推导,0代表外部链,1代表内部链。外部链用于地址,钱包外部可见,如用于收款。内部链钱包外部不可见,用于返回交易改变。
address_index为普通推导,从0开始递增。
该例子来自 https://www.myetherwallet.com/ &解锁硬件钱包时的界面,现在你知道这些表示方法的含义了吧?
币的种类附录(常见)
来源:乐链网&http://www.lechain.com/portal.php?mod=view&aid=1137
比特币多空调查
最新数字货币
扫一扫关注我们
郑重声明:本站主要用于区块链行业信息的传播,促进行业健康发展,部分信息均搜集转载自互联网 版权归原作者所有 如作者信息标记有误 请第一时间联系我们修改或删除 谢谢!QQ群: @2017qukuaiwang.com.cn 区块网 闽ICP备号-5拒绝访问 | www.cybtc.com | 百度云加速
请打开cookies.
此网站 (www.cybtc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3fddf2f019c043ef-ua98).
重新安装浏览器,或使用别的浏览器技术福-Qtum量子链开发者 带你入门比特币区块链_比特币_金色财经
Android & iPhone
技术福-Qtum量子链开发者 带你入门比特币区块链
这篇文章将介绍区块链工作原理及其如何以安全的方式进行价值传输,并对比特币、Qtum量子链等使用未花费交易模型UTXO的数字货币的底层机制进行详细介绍。另外一种用于区块链资金管理的账户模型(Account&Model)本文将不作赘述。比特币中常见术语解释首先,以防读者对区块链、比特币毫无了解,这里先对比特币中常见术语做一个解释。——单向哈希函数(或“哈希函数”):利用密码学算法将任意长度的数据输入转换成固定长度的“哈希值”或“摘要值”。哈希运单是单向性的,仅通过输出的哈希值/摘要无法反向推算出原始输入数据。比特币使用的是最常见哈希算法SHA256,除此以外还有SHA3、RIPEMD160、scrypt等。——公钥密码学:是一种加密机制,通过该机制可以将“私钥”转换为“公钥”,并用于证明私钥的所有权而无需透露私钥内容本身。此外,还可以使用公钥对数据进行加密,只有对应私钥持有人才能进行数据解密。在比特币中,公私钥机制用来进行交易签名。签名数据和公钥可以用来证明交易所有人持有相对应的私钥。——默克尔哈希树:是一种树状的数据结构,利用单向哈希函数将若干数据块进行哈希加密,使在不更改默克尔根哈希值的情况下无法对树上输入信息进行修改。——UTXO:未花费交易输出,即某个交易的未花费输出值。——区块:区块链上可供验证和且无法伪造的最小单位。它包含众多数据用于证明交易及其共识机制。比特币交易是如何完成的接下来,我来介绍一下交易是如何完成的。比特币的交易过程与银行支票取现过程相似。——当用户想要花费某个交易的“输出”,必须全部花费;就像是当你到银行进行支票取现,必须全部取现。当然,比特币中没有类似于现金和银行账户的概念。因此如果要发送资金,首先需要将“支票取现”,然后“输出”至想要发送的地址,并返回可供下次发送资金的余额。——在比特币中,花费1个或多个UTXO时,接收地址增加对应数量的UTXO。此过程中,花费的交易称为“vins”,新生成的UTXO称为“vouts”。一旦UTXO被某个交易使用后便被销毁,其交易历史信息可以在区块链上查询。比特币UTXO中使用了公钥密码学这里还有另外一个问题,银行支票上都有名字证明资金接收方。而在比特币UTXO中使用了公钥密码学。从技术的角度来看,当UTXO中的脚本返回值为“真”时,该UTXO才被判定为是“可被花费的”。让我们拿一个最简单的脚本举例:[pubKey] OP_CHECKSIG这是“支付到比特币地址的标准交易”[1],也是第一个标准比特币交易类型。其中,[pubKey]是指公钥数据,与其相对应的私钥由其持有人所有。公开公钥对安全性并没有什么影响。比特币使用的编程语言是基于堆栈的比特币使用的编程语言是基于堆栈的。因此,想象你有一堆纸质文档,将公钥信息写在纸上,并放入文件夹的顶端。该脚本的另一部分是OP_CHECKSIG。该操作会从文件夹里从上之下取出两张纸,一张纸写着公钥信息,第二张纸写着OP_CHECKSIG对应的加密签名。——这个过程听起来是不是够令人困惑了,坚持一下。通过OP_CHECKSIG脚本从堆栈中获取两个值,但该脚本似乎只有一个输出值,即‘pubKey’。‘vin’值的重要性也正体现于此。‘vout’脚本对应的是支票上的收款人信息,而‘vin’值对应支票背面的签名,证明该交易以及收款人信息的真实性。在比特币中,该脚本不会执行直至该交易被花费。交易被花费时,首先执行‘vin’脚本,然后将输出结果数据从vin堆栈转移至vout堆栈。因此在实际执行过程中,这个脚本实际上是:[signature from vin] [pubKey] OP_CHECKSIG——Vout脚本可以作为一个挑战,而vin可以作为挑战相对应的应答。有了vin提供的签名并试图花费这些资金,则可以执行这个脚本了。若签名与公钥均有效,则OP_CHECKSIG返回“真”值,相对应的UTXO也可被成功花费。因此在任意交易中,每个vin都对应上一个交易的UTXO,并提供导致UTXO脚本返回真值所需答案。无效或相似签名会导致脚本返回“非真”,对应交易则被视为无效。正如之前提到的,仅花费部分UTXO是无法实现的,必须全部花掉或全部保留。举例来说,若一个UTXO中包含有10个代币,其中7个发送给Bob,那么需要创建一个交易,将10个代币所在的UTXO全部花费,并生成两个输出:一个输出给Bob(利用他的公钥),自己保留另一个输出(保证你可以提供花费这个输出vout所对应的“答案”),这一输出称为“更改地址”。一般来说,每个钱包都有多达上百个公钥和私钥,钱包的“总余额”为钱包中可用于花费的所有输出的总和。使标准比特币地址显著缩短之前我们提到,仅利用公钥执行交易之所以过时,其主要原因之一是公钥过大,公钥地址举例如下:04e70a02f5af48a523c9d14c45c75f7d1b998e962bff6ff9995fc5bdb44fd80324acba7c8f537caafd8a93而标准的比特币地址类似于17L2iLaPvbCMaEieYZwYb18T4H2cq1vz2g。有两个原因使标准比特币地址显著缩短:一是“基于58编码”;二是其并不包含所有公钥数据,而只是其哈希值。该地址与“P2PK”交易地址相关联,其脚本类似于:OP_DUP OP_HASH160 [pubKeyHash] OP_EQUALVERIFY OP_CHECKSIG&这里我不会对脚本执行进行完整的解释(相关解释可以参考比特币Wiki [2])。这类型交易广泛使用的原因我概括为以下两点:1. 公钥的哈希值长度为160位,远远小于公钥本身的长度,方便地址交换但手写地址仍不现实;2. 以防比特币使用的公钥加密出现漏洞,仅使用公钥地址对应的哈希值相对来说更为安全(尽管每一笔交易需要使用不同的公钥/地址)Base58地址接下来介绍Base58地址。区块链上储存的公钥哈希值(pubkeyhash)类似于“456ae0d3dcdeb59e8ec”。在网络中以这种数字形式进行地址交换,一个小小的拼写错误就可能会导致资金的流失。此外,仅凭这种地址记录方式无法区分pubkeyhash交易和全新pay-to-scripthash交易。* 版本号* 数据(可为公钥哈希值、脚本哈希或其他类型数据)* 校验值其中,版本号用于识别数据:version1为pubkeyhash;version3为scripthash。校验值用于解决拼写错误。输入任意长度数据并输出固定长度的摘要值用于数据校验。数据校验值用于检查数据的完整性,类似于“非安全”版的加密哈希运算,并且有更多严格的应用。结合上述数据,并进行Base58编码。通俗来讲,Base58利用58种字符将数据翻译为文本信息,与用0和1表示的二进制编码类似。比如英文“testing”在Base58编码中对应字符为“5QqG6hNRBU”。这样,我们利用交易和脚本进行代币交换,并理解了资金如何进行储存。但仍然面临一个问题,如何确定你接收到的交易输出没有被进行二次花费?这就回归到区块链本身的特性,从底层代码和运行机制上避免了双花的情况发生。比特币区块的区块头信息包含的数据比特币区块的区块头信息包含以下数据:&* 版本号* 上一区块头信息哈希* 区块内所有交易的默克尔根哈希值* 创建时间* 难度值* 随机数完整的交易信息(甚至包括见证人信息)都会记录在区块中。正是由于每个区块包含了上一个区块的参考值信息,因此无法对历史区块信息进行恶意修改。修改历史区块信息会导致区块哈希值,并导致“区块哈希链”的断裂。比特币使用了工作量证明共识机制(PoW)比特币使用了工作量证明共识机制(PoW)。具体的工作原理会在另一篇文章中详细解释。简单来说,PoW需要系统中的矿工通过一定量的计算工作解决一个复杂的数学难题。第一个解决难题的矿工将会得到相应的奖励,而新产生的区块也将添加至区块链上。至于计算工作的难易程度则由区块中定义的“难度值”参数决定。全网的难度值并不是一成不变的,而是根据整个区块链生命周期期间的算力总和进行调整。在比特币中,“区块目标时间”设定为10分钟,系统利用共识机制对难度值进行自动调整,并达到预先设定的目标时间。比如说,如果系统每5分钟产生新的区块,小于预设的目标时间,则系统会自动增大难度值,则矿工需要投入更多的算力解决数学难题,反之亦然。在实际操作中,比特币难度值每两周调整一次(即每1008个区块)。需要说明的是,难度值一般以数字表示,如14,484.16。当然,这种表示方式是方便人们阅读。区块链系统使用256字节的数字表示难度值。如果256字节的区块哈希值小于难度值,则该区块被认为是有效区块,并添加至链上。在PoW中只有区块头信息用于共识机制的维护,而默克尔根哈希值用于验证区块交易,同时确保交易可达性。当一个区块被创建后,相对应的交易则被视为是“永恒的”。除了偶尔发生的“孤儿块”情况,将交易对应的区块进行完整替换是发起UTXO双花攻击的唯一方法。&但由于区块上包含了历史区块的参考值信息,大大降低了这种攻击成功的可能性,并且成功攻击所消耗的算力是呈指数增长的。因此在很多比特币相关服务中都会等待3到6个不等的“确认”,从而保证交易的有效性。这些代币是如何产生的呢?还剩最后一个问题:这些代币是如何产生的呢?答案是“挖矿”。在挖矿过程中,矿工在交易中添加“coinbase”交易。&该类交易没有任何输入,并输出一定数量的代币(目前为12.5个比特币)。系统中的代币都由coinbase交易产生,若无代币,则没有交易的生成,整个系统也就没有存在意义。好了,现在你应该对区块链是如何安全地进行价值传输,通过增加难度值或更多“确认”防止双花攻击,并且对比特币、Qtum量子链和其他基于UTXO模型的数字货币在协议层的工作原理等有了一定的了解。更多详情:1:&https://en.bitcoin.it/wiki/Script#Obsolete_pay-to-pubkey_transaction2: https://en.bitcoin.it/wiki/Script#Standard_Transaction_to_Bitcoin_address_.28pay-to-pubkey-hash.29
比特币实时价格 ¥52229.31 (数据来源:火币Pro)
声明:本文系金色财经原创稿件,版权属金色财经所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明&稿件来源:金色财经&,违者将依法追究责任。
个人实名认证
文章总浏览数
京ICP备号Copyright (C) 金色财经 版权所有
您投送的稿件违反了金色财经的投稿协议,现已关闭您的投稿功能,如有异议请发邮件至进行申诉。登录以解锁更多InfoQ新功能
获取更新并接收通知
给您喜爱的内容点赞
关注您喜爱的编辑与同行
966,690 二月 独立访问用户
语言 & 开发
架构 & 设计
文化 & 方法
您目前处于:
揭秘比特币和区块链(三):比特币的私钥、公钥与地址
揭秘比特币和区块链(三):比特币的私钥、公钥与地址
12&他的粉丝
日. 估计阅读时间:
,人工智能、区块链、大数据、架构等领域海内外先驱实践!
亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的。
相关厂商内容
相关赞助商
如今密码学相关技术已经深入各个领域,它们的理论共识都遵循由奥古斯特&柯克霍夫在19世纪提出&柯克霍夫原则&&& 密码系统应该即使被所有人知道其运作步骤,仍然是安全的。即算法是公开的,唯一需要保护的是密钥。
1949年香农发表了《保密系统的信息理论》,为对称密码系统建立了理论基础,带来了加密传输基于秘钥安全而不是基于加密算法安全的理论和技术变革。这是密码学发展的里程碑,标志着现代密码学时代的来临。
公钥密码学兴起之前,对称加密是主流的加密模式,人们基于秘钥来对信息进行加解密,通常情况下,密钥越长,代表着密文被破解的难度越大。由于加密算法和解密算法都是同一模式,只有一把密钥保证加密数据的安全,因此这种加密算法也叫做&对称加密算法&。对称加密有一个最大弱点:甲方必须把密钥告诉乙方,否则乙方无法解密。而保存和传递密钥,就成了最头疼的问题。
公钥密码学是现代密码学最重要的进展。公钥密码学可以在不直接传递密钥的情况下,完成密文的解密。加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,系统的安全性既不依赖算法的保密,也不用直接传递密钥。基于这种公钥机制的思想,开始出现了一系列非对称加密算法。
1976年Whitfield Diffie & Martin Hellman首次提出了基于数学难题的公钥密码机制,1978年RSA公钥密码机制的出现,成为公钥密码的杰出代表并成为事实标准,在密码学史上创造了又一个新的里程碑。90年代公钥密码学进一步发展,基于椭圆曲线乘法、素数幂等数学函数的公钥算法诞生,使得数字密钥和不可伪造的数字签名成为可能。
数据签名算法的核心在于证明数据的发送方是签名者发出的、不可抵赖,而不是待签名数据的保密性。
下图比较说明非对称加密与对称加密算法的区别:
非对称加密需要两个(一对)密钥:公开密钥(publickey)和私有密钥(privatekey),用公钥对数据进行加密后,只有对应的私钥才能解密;反之如果私钥用于加密,则只有对应的公钥才能解密。通信双方无须交换密钥就可以建立保密通信。
公钥算法用到的是私钥与公钥,他们和比特币体系中常常说到的地址有什么关系?在比特币系统中,私钥由32字节的随机数组成,通过私钥可以算出公钥,公钥经过一系列哈希及编码算法就得到了比特币中的地址。所以地址其实是公钥的另一种表现形式,可以理解为公钥的摘要。
2、相关的加密算法
在私钥、公钥及地址的相关运算中,用到了基于secp256k1椭圆曲线乘法的签名算法、SHA-256、RIPEMD-160,和Base58编码。
2.1椭圆曲线签名算法
椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。它的主要优势是在某些情况下它比其他的算法(比如RSA)使用更小的密钥但提供相当的或更高等级的安全性。
比特币使用了基于secp256k1椭圆曲线数学的公钥密码学算法。它包含私钥与公钥,私钥用于对交易进行签名,将签名与原始数据发送给整个比特币网络,公钥则用于整个网络中的节点对交易有效性进行验证。签名算法保证了交易是由拥有对应私钥的人所发出的。
2.2 哈希函数
SHA-256是一种哈希函数,已经在上一节的讲解中做了介绍,这里不再赘述。
RIPEMD-160也是在生成地址时用到的一种哈希函数,其输出长度为20字节(160位)。比特币用它减少标识接收方的字节数。
2.3 Base58编码
可读性编码算法,类似古典密码学里的置换算法,理论上并不是密码学理论的核心内容。可读性编码算法不是为了保护数据的安全性,而是为了可读性。以二进制进行传输的信息是不具备可读性的,数字与字母组成的字符串才更容易被识别。可读性编码不改变信息内容,只改变信息内容的表现形式(部分编码算法还加入了容错校验功能,以保证传输过程中数据的准确性和完整性)。
Base64是常见的可读性编码算法,所谓Base64,即是说在编码过程中使用了64种字符:大写A到Z、小写a到z、数字0到9、&+&和&/&。
Base58是Bitcoin中使用的一种编码方式,主要用于产生Bitcoin的钱包地址。相比Base64,Base58不使用数字&0&,字母大写&O&,字母大写&I&,和字母小写&i&,以及&+&和&/&符号。
设计Base58主要的目的是:
避免混淆。在某些字体下,数字0和字母大写O,以及字母大写I和字母小写l会非常相似。
不使用&+&和&/&的原因是,非字母或数字的字符串难以作为账号的一部分被接受。
没有标点符号,通常不会被从中间分行。
使大部分的软件支持双击选择整个字符串。
比特币中使用Base58算法来对公钥的Hash160及私钥进行编码,以生成以1或3开头的比特币地址及WIF(Wallet import Format)格式的私钥。
3、私钥与公钥
比特币私钥其实是使用SHA-256生成的32字节(256位)的随机数,有效私钥的范围则取决于比特币使用的secp256k1 椭圆曲线数字签名标准。大小介于0x1 到0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4140之间的数几乎都是合法的私钥。
在私钥的前面加上版本号,后面添加压缩标志和附加校验码,(所谓附加校验码,就是对私钥经过2次SHA-256运算,取两次哈希结果的前四字节),然后再对其进行Base58编码,就可以得到我们常见的WIF(Wallet import Format)格式的私钥。
私钥经过椭圆曲线乘法运算,可以得到公钥。公钥是椭圆曲线上的点,并具有x和y坐标。公钥有两种形式:压缩的与非压缩的。早期比特币均使用非压缩公钥,现在大部分客户端默认使用压缩公钥。
由于数学原理,从私钥推算公钥是可行的,从公钥逆推私钥是不可能的。
初识比特币的人常有一种误解,认为比特币公钥就是地址,这是不正确的。从公钥到地址还要经过一些运算。
4、地址的生成
椭圆曲线算法生成的公钥信息比较长,压缩格式的有33字节,非压缩的则有65字节。地址是为了减少接收方所需标识的字节数。比特币地址的生成步骤如下:
生成私钥与公钥
将公钥通过SHA256哈希算法处理得到32字节的哈希值
后对得到的哈希值通过RIPEMD-160算法来得到20字节的哈希值 && Hash160
把版本号+Hash160组成的21字节数组进行双次SHA256哈希运算,得到的哈希值的头4个字节作为校验和,放置21字节数组的末尾。
对组成25位数组进行Base58编码,就得到地址。
下图以非压缩格式的65字节公钥示意上述过程:
由于椭圆曲线乘法以及哈希函数的特性,我们可以从私钥推导出公钥,也可以从公钥推导出地址,而这个过程是不可逆的。也正因如此,在整个比特币系统中,私钥是最关键的部分。私钥泄露也就意味着丢失了一切。
我们要花掉一个地址上的资产,需要构造一笔交易,同时使用这个地址对应的私钥签名。而如果我们要将资产转移到某个地址上,只需要转账给他公开的地址就行了。
在下一节,我们将详细讲述比特币交易是如何构成和实现的。
[1] http://www.infoq.com/cn/articles/bitcoin-and-block-chain-part02
[2] 普通地址P2PKH的版本默认值是0,P2SH类型的地址版本默认值是5
感谢对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至。也欢迎大家通过新浪微博(,),微信(微信号:)关注我们。
Author Contacted
语言 & 开发
296 他的粉丝
架构 & 设计
712 他的粉丝
8 他的粉丝
1 他的粉丝
告诉我们您的想法
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p
当有人回复此评论时请E-mail通知我
赞助商链接
InfoQ每周精要
订阅InfoQ每周精要,加入拥有25万多名资深开发者的庞大技术社区。
架构 & 设计
文化 & 方法
InfoQ.com及所有内容,版权所有 ©
C4Media Inc. InfoQ.com 服务器由 提供, 我们最信赖的ISP伙伴。
极客邦控股(北京)有限公司
找回密码....
InfoQ账号使用的E-mail
关注你最喜爱的话题和作者
快速浏览网站内你所感兴趣话题的精选内容。
内容自由定制
选择想要阅读的主题和喜爱的作者定制自己的新闻源。
设置通知机制以获取内容更新对您而言是否重要
注意:如果要修改您的邮箱,我们将会发送确认邮件到您原来的邮箱。
使用现有的公司名称
修改公司名称为:
公司性质:
使用现有的公司性质
修改公司性质为:
使用现有的公司规模
修改公司规模为:
使用现在的国家
使用现在的省份
Subscribe to our newsletter?
Subscribe to our industry email notices?
我们发现您在使用ad blocker。
我们理解您使用ad blocker的初衷,但为了保证InfoQ能够继续以免费方式为您服务,我们需要您的支持。InfoQ绝不会在未经您许可的情况下将您的数据提供给第三方。我们仅将其用于向读者发送相关广告内容。请您将InfoQ添加至白名单,感谢您的理解与支持。}

我要回帖

更多关于 比特币 哈希谜题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信