区块广播:
20
已解决

比特币地址是怎么产生的?

zhuoji船员发布在 问答/互助
 4430  7
比特币地址是怎么产生的?能不能说的详细一点

帖子标签: 比特币地址
最佳答案
510685947副船长
2016-03-28 15:10:14
比特币地址生成(图形化)来源http://www.8btc.com/graphical-address-generator
  • 正序
  • 最新
只看帖主楼层直达
  • 510685947 副船长 2016-03-28 15:10:14 来自PC沙发
    比特币地址生成(图形化)
    来源http://www.8btc.com/graphical-address-generator
  • 510685947 副船长 2016-03-28 15:27:06 来自PC板凳
    首先,让我们先简单的说说比特币地址是怎么算出来的。比特币是建立在数学加密学基础上的,中本聪大神用了椭圆加密算法(ECDSA)来产生比特币的私钥和公钥。由私钥是可以计算出公钥的,公钥的值经过一系列数字签名运算会得到比特币地址。
    需要说明的是:因为由公钥可以算出比特币地址,所以我们经常把公钥和比特币地址的说法相混淆,但是他们都是指的一个概念。比特币地址只是另一种格式的公钥。
    从比特币私钥得到我们所用的比特币地址需要九个步骤。中间要用到SHA256加密、RIPEMD160加密和BASE58编码。我们最终用到的比特币私钥和比特币地址一般都是经过BASE58编码的结果。整个流程如下图所示。



    第一步,随机选取一个32字节的数、大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥。
    18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725

    第二步,使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)关于公钥压缩、非压缩的问题另文说明。

    0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B
    23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6

    第三步,计算公钥的 SHA-256 哈希值
    600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408

    第四步,取上一步结果,计算 RIPEMD-160 哈希值
    010966776006953D5567439E5E39F86A0D273BEE

    第五步,取上一步结果,前面加入地址版本号(比特币主网版本号“0x00”)
    00010966776006953D5567439E5E39F86A0D273BEE

    第六步,取上一步结果,计算 SHA-256 哈希值
    445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094

    第七步,取上一步结果,再计算一下 SHA-256 哈希值(哈哈)
    D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30

    第八步,取上一步结果的前4个字节(8位十六进制)
    D61967F6

    第九步,把这4个字节加在第五步的结果后面,作为校验(这就是比特币地址的16进制形态)。
    00010966776006953D5567439E5E39F86A0D273BEED61967F6

    第十步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)。
    16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM

    (说明: 有些数字以"0x"开头,意思是此数字使用十六进制表示法。"0x"本身没有任何含义,它是C语言流传下来的,约定俗成的写法,比如0xA就是十进制的10。另外,1个字节 = 8位二进制 = 2位十六进制)。

    我们经常说的比特币公钥就是指的图中第二步所产生的结果。而HASH160指的是第四步RIPEMD160签名所产生的结果,由于RIPEMD也是一种HASH算法所以就统称为HASH160了。而我们常用的比特币地址就是经过BASE58编码后的结果。

    比特币客户端和钱包也接受各种比特币地址格式,常用的格式有BASE58格式、WIF压缩格式、130位和66位公钥(Public key)格式。进入比巴克的钱包工具点击钱包详情查询页面,如下图,红色框中130位的字符串就是比特币ECDSA算出的原始公钥,下面是公钥压缩成66位的格式,上面两个分别是我们常用的比特币BASE58地址格式和比特币地址WIF(wallet import format)压缩格式。


    其实现在各种格式的地址基本上都是通用的,在学习了相关知识后,我们会对比特币体系有更加深入的理解。
    Gobittest网站(国外可访问)提供了从比特币原始私钥到公钥再到HASH160和BASE58的计算程序,读者可以参考。
    来源:http://topic.8btc.com/article-1929-1.html
  • ffzh888 副船长 2016-03-28 19:44:36 来自PC地板
    用26个英文字母,和10个阿拉伯数字组成,共36个!
  • 小白updata 版主 2016-03-28 19:54:58 来自App5楼
    510685947 发表于 2016-3-28 15:25 比特币地址生成(图形化) 来源http://www.8btc.com/graphical-address-generator
    哥,我看密码学的书,上面说,解密算法空间有26!种,这是什么意思
  • menxiang 船员 2016-03-28 20:02:42 来自PC6楼
    大神辛苦了!拜读中
  • 秦的爱恋 船长 2016-03-28 20:07:46 来自App7楼
    510685947 发表于 2016-3-28 15:27 首先,让我们先简单的说说比特币地址是怎么算出来的。比特币是建立在数学加密学基础上的,中本聪大神用了椭 ...
    好复杂啊,技术盲不懂
  • 玛_雅 版主 2016-03-28 23:14:41 来自App8楼
    ffzh888 发表于 2016-3-28 19:44 用26个英文字母,和10个阿拉伯数字组成,共36个!
    我觉得不用详细到那么详细吧。 图形化显示过程http://idgui.com/P 简单点说: 1,找个随机字串,脑钱包通过对脑口令取SHA256的结果作为随机字串。 2,Base58Check编码后作为私钥字串。 3,带入椭圆曲线,算出公钥。 4,将公钥SHA256和RIPE160求HASH后得到一串16进制字串。 5,对这个字串进行Base58Check编码后即得到地址。
    生成的关键是在于Base58Check编码,其实若生成没有私钥的比特币地址根本就没有那么麻烦。仅仅一串40位的16进制字串,对其加版本号进行Base58Check编码即可。
    层主说的不对,是26个大写字母,加26个小写字母,再加10个数字,共62个。 然后为了避免混淆,去掉大写i,大写o,小写L和数字0,这样62-4=58个。 即用这58个字符来编码。 因为开头加版本号0,故Base58编码过去就是相当于0的1,即比特币地址(非合成地址)都是以1开头的。 之所以用Base58Check而不是只用Base58,是为了避免中间有个别的输错。也就是说,最后几位是校验位。有点类似身份证号码的最后一位。
    另外还有一种以3开头的合成比特地址,这种地址,一般需要由几个公钥,经过createmultisig算法命令生成。其没有对应的私钥,需要按生成时的参数签名要求来签名花币。http://idgui.com/n/ChainQuery.htm 比如2 of 3 需要三个中的两个签名才能花费币。因此这样3开头的比特币地址,一般来说会更安全一些。但其生成和花币的技术难度更高些。
登录 账号发表你的看法,还没有账号?立即免费 注册