比特币中的密钥、地址、钱包

96
乔延宏
2017.07.06 22:14* 字数 2047

密钥

一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。

私钥公钥地址

私钥

私钥就像密码,是随机生成出来的,就像你打开bitaddress.org,随便点击就可以产生私钥,把私钥使用椭圆曲线乘法这个单向加密函数就可以产生一个公钥。有了公钥,我们就可以使用一个单向加密哈希函数生成比特币地址。
在btc 客户端中可使用getnewaddress命令生成一个公钥,但是实际上这个命令产生的是一对密钥,私钥不可见,可以使用dumpprivkey命令读取钱包里由getnewaddress命令生成的私钥,然后显示出来。
私钥编码由几种格式,如下表:

私钥编码格式

公钥

通过椭圆曲线算法可以从私钥计算得到公钥,这是不可逆转的过程。

以一个随机生成的私钥k为起点,我们将其与曲线上已定义的 生成点G相乘以获得曲线上的另一点,也就是相应的公钥K。k和K之间的关系是固定的,但只能单向运算,即从k得到K。这就是可以把比特币地址(K的衍生)与任何人共享而不会泄露私钥(k)的原因。

公钥实际上是椭圆上的一个点,因此应该表示为(x,y)放入形式。公钥分为非压缩格式或压缩格式公钥这两种形式。前缀就是表示格式类型的。压缩格式的目的就是为了减少数据量,为此目的,还把公钥用一个x值表示,让系统在需要时通过椭圆方程计算出y的值。

比特币地址

比特币地址可由公钥经过单向的加密哈希算法得到。地址是公钥增加了一些信息之后的产物,包括版本,哈希值,校验码,自后还要进行编码。

由公钥到地址

下表为版本前缀的类型。

版本前缀的类型

比特币钱包

确定性钱包

钱包很重要的一个功能是生成私钥。当前主流的钱包都是确定性(种子)钱包,也就是只有一个种子(seed),种子可以管理所有的私钥,方便导入导出,适合在不同设备安装钱包的需要。

助记码

助记码对应种子,通过一串单词,方便记忆和导出。这些单词以及顺序可以帮助重建钱包的种子以及钱包中的所有私钥。

BIP0039定义助记码和种子的创建过程如下:
1.创造一个128到256位的随机顺序(熵)。
2.提出SHA256哈希前几位,就可以创造一个随机序列的校验和。
3.把校验和加在随机顺序的后面。
4.把顺序分解成11位的不同集合,并用这些集合去和一个预先已经定义的2048个单词字典做对应。
5.生成一个12至24个词的助记码。

分层确定性钱包(HD钱包)

这种钱包可以从种子生成母钥,子钥,孙钥,形成层级结构。使用兼容HD钱包的根种子也可重新创造整个HD钱包。所以知识转移HD钱包的根种子就可以实现让HD钱包中所包含的成千上百万的密钥被复制,储存导出以及导入。
分层钱包的作用在于钥匙分权,尤其是投资额很大的账户,或者是对公账户。

高级密钥和地址

加密私钥(BIP0038)

私钥也需要加密,目的是防止钱包丢失,转移时还有最后一道防线:加密私钥的密码。
BIP0038的做法是用一个口令作为密码对私钥进行加密,并使用Base58Check对加密的私钥进行编码,这样加密的私钥就可以安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露情况下的安全性。这样的加密私钥的开头是6p,就是说6p开头的私钥是加密过的私钥,需要一个口令来转换(解码)该密钥回到可被用在任何钱包WIF格式的私钥(前缀为5)。如果是这样的钱包就是需要输入口令进行解码才能导入私钥。

P2SH (Pay-to-Script Hash)和多重签名地址

传统的比特币地址从数字1开头,以数字3开头的比特币地址是P2SH地址。

不同于P2PKH交易发送资金到传统1开头的比特币地址,资金被发送到3开头的地址时,需要的不仅仅是一个公钥的哈希值,同时也需要一个私钥签名作为所有者证明。在创建地址的时候,这些要求会被定义在脚本中,所有对地址的输入都会被这些要求阻隔。

多重签名地址和P2SH
P2SH 不一定是多重签名的交易。虽然P2SH地址通常都是代表多重签名,但也可能是其他类型的交易脚本。换句话说,多重签名是P2SH函数最常见的应用。多重签名主要用于共有N个密钥却需要M个签名的场合,比如层级授权的公司账户。这种情况被称为M-N多签名,其中M是等于或小于N。

比特币靓号地址

就是btc地址包括有意义字符,通常在开头几位。

靓号地址需要生成并通过数十亿的候选私钥测试,直到一个私钥能生成具有所需图案的比特币地址。虽然有一些优化过的靓号生成算法,该方法必须涉及随机上选择一个私钥,生成公钥,再生成比特币地址,并检查是否与所要的靓号图案相匹配,重复数十亿次,直到找到一个匹配。

靓号的出现的频率(1KidsCharity)以及生成所需时间

靓号的好处:容易识别
靓号的缺点:大量宣传的靓号会带来被攻击的风险,因为所有的交易都是使用这个地址,黑客就会花时间精力破解网站,用自己的地址代替这个收款地址。
当然靓号足够靚,生成的成本足够高,破解难度也就随之增高。

纸钱包

纸钱包就是把私钥写在纸上锁进柜子里。作为冷钱包的一种,可以避免任何网络上的攻击,比较安全。
纸钱包生成工具:使用bitaddress.org网站上的客户端Javascript生成器。
使用方法:在线打开bitaddress.org,待页面加载完成,右键点击页面,选择网页另存为,将网页保存到本地。然后找一台不上网的电脑或者拔掉网线,打开刚才下载的文件,随便晃动鼠标,等待进度到100%,点击纸钱包,就可以看到钱包,打印出来就可以了。如下图。

生成纸钱包

但是这样的纸钱包存在物理安全的风险,被人偷走了,或者被人扫码了,私钥就丢失了。这个网站还提供添加密码的纸钱包,就是把下图中的选择项勾上,填入密码,点击生成就可以了。提醒密码复杂度是有要求的。

生成带密码的纸钱包

参考内容:
精通比特币

区块链学习
Web note ad 1