私钥,公钥和地址--精通比特币(第二版)第四章精华

# 简介

*比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的。*

就好比银行里面钱的所有权,要确认这笔钱属于你,一般是需要你知道银行账户(公钥),自己的密码(私钥),以及一个签名来确认的。在支付钱的时候,卖家给你的也是一个账号,而非自己的密码。稍微有点差别的是,在程序世界中,因为账号,密码是一一对应的,而数字签名也是由有效的密钥才能产生。*所以只需你知道私钥,就可以拥有一笔比特币的所权*。同样其他人知道了你的私钥,也可以轻易的拿着这笔比特币。

# 私钥和公钥

*从私钥到公钥,再到公钥到地址。这个推导流程都是单向的*。很难逆向推导。这是由于不对称加密的方式导致的。什么是不对称加密呢?就是往一个方向做计算很容易,但从另外一个方向反推就很困难。比如,做幂乘积相对简单,但求对数就很难。

## 私钥是如何产生的?

*比特币私钥是一个256位二进制数字*
可以通过各种能产生是或否的算法计算256次。比如抛256次硬币。只要这个过程是*不可预测或不可重复*的,那么选取数字的具体方法并不重要。
比特币软件使用操作系统底层的随机数生成器来产生256位的熵(随机性)。通常情况下,操作系统随机数生成器由人工的随机源进行初始化,这就是为什么也可能需要不停晃动鼠标几秒钟。

## 公钥

* K=k\*G
其中k是私钥,G是生成点,在该曲线上所得的点K是公钥。因为所有比特币用户的生成点是相同的,一个私钥k乘以G将 得到相同的公钥K.


# 椭圆曲线加密

给定椭圆曲线上的点P,如果k是整数,则 kP = P + P + P + …+ P(k次)

给定椭圆曲线上的两个点P1和P2,则椭圆曲线上必定有第三点 P3 = P1 + P2。几何图形中,该第三点P3可以在P1和P2之间画一条线来确定。这条直线恰好与椭圆曲线相交于另外一个地方。此点记为 P3’= (x,y)。然后,在x轴做翻折获得 P3=(x,-y)。为了处理一些特殊点,比如A(x,y),B (x,-y)所组成的线与曲线相交的情况(曲线与x轴垂直),需要引入无线电Aoo。这个点与其他个点相加,所得到的结构仍为其他点。A(x,y)+B (x,-y)=Aoo,

由于实数范围很大,很难应用于实际的加密中。为了便于应用,在实际运用中,还将使用范围控制在质数P个。这样能形成的集合能够满足一定的数学要求。例如互换, 除法等。在*限定在一个素数范围后,曲线就不再是一个连续的曲线,而是一些离散的点*。比如素数阶17的有限域内的椭圆曲线。

## 为什么椭圆曲线加密能够单向加密?

公钥加密使用的是椭圆曲线加密法。*其特性导致了做乘法容易,除法难*。该曲线加密的特点在于:你拿球从A射向B.当它撞上曲线,这个球向上反弹或者向下反弹到X轴的另外一侧。以这个规则,若有个人知道了要加的次数和起始点,他可以很容易得知终点在什么地方。但反过来就很复杂,你只知道初始末尾两个点是很难知道这个推导是经过了多少步,那异常艰难。
另外,相比于其他加密方式,椭圆曲线加密可以要求数据长度更短,这样对存储的要求更低。

## 如何简单理解椭圆曲线加密呢?

知乎上Chizhong Jin有段很生动的描述:(链接:https://www.zhihu.com/question/22399196/answer/308626466)
有一天张三挑出了两个数字,123,456。由于张三会乘法,于是乎张三计算出了:
123 \*456 = 56088 于是张三告诉你:123\*??? = 56088
你是个天资卓绝的人,但是没办法,上天不允许你会除法 (乘法大家都会,但除法大家都不会),因此你没法知道张三说的???是什么。
有一天,你打算告诉张三一个秘密,67。但是你又不想别人知道。于是聪明绝顶的你随手选了一个数字222。计算出:
123\*222 = 27306  56088\*222 + 67 = 12451603
然后你对张三说:
123\*??? = 27306
56088\*??? + x = 12451603
当然,你聪明绝顶,张三聪明秃顶,于是张三一寻思:
123\*???\*456 = 56088\*???
这上下一减,x = 12451603 - 27306\*456 = 67
哎妈呀,这x就这么被传递过来了。
如果我们把上面的过程写成数学公式的话,就是
G\*k = K (G,K公开,k保密)
c1 = G\*M
c2 = K\*M + x (M随机选取,x为要加密的数字,M和x都保密)
x = c2 - c1\*k
= K\*M + x - G\*M\*k
= G\*M\*k + x - G\*M\*k (消除左右两侧的G\*M\*k)
= x

# 公钥私钥的格式

## 公钥的格式

公钥是在椭圆曲线上的一个点,由一对坐标(x,y)组成。公钥通常表示为前缀04紧接着两个256比特的数字 ( 130个十六进制数字)。其中一个256比特数字是公钥的x坐标,另一个256比特数字是y坐标。
如 K = 04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE
52DDFE2E505BDB

压缩公钥:由于Y其实是X的一个函数,在知道了X后可以轻易推导出Y。所以为了节省储存数量,就可以只记录X的数据即可。这样可以节省256个比特。但由于在曲线函数中Y是以平方的形式出现的,所以会出现正负两个解。为了对这个进行区别,在前导字符用不同的数字指明正负的形式。

*未压缩格式公钥使用04作为前缀。我们在生成压缩格式公钥时,如果y是偶数,则使用02作为前缀;如果y是奇数,则使用03作为前缀*

## 私钥的格式

*压缩的私钥”实际上只是表示“用于生成压缩格式公钥的私钥”*。压缩的私钥比非压缩的私钥多了一个字节 (十六进制为01)。这是为了告诉钱包,这个私钥已经被用于生成压缩公钥以及地址了。虽然Base58编码版本前缀对于WIF和WIF压缩格式都是相同的(0x80),但在数字末尾添加一个字节会导致Base58编码的第一个字符从5变为K或 L

# 比特币地址

## 比特币地址为什么长度不同?

由于6位二进制代码有可能出现大于58的情况,所以在Base58中在进行编译时,可能出现按照*6位二进制切分编译也可能出现按照5位二进制切分编译*的情况。所以可能会出现不同长度的“Base58Check”编码的地址。

## 比特币地址为什么开头字母不一样?

# 其他一些应用:

1:加密私钥。
BIP0038加密方案是(BIP:比特币优化建议):输入一个比特币私钥,通常使用WIF编码过,base58chek字符串的前缀“5”。此外BIP0038加密方案需要一个长密码作为口令,通常由多个单词或一段复杂的数字字母字符串组成。BIP0038加密方案的结果是一个由base58check编码过的加密私钥,前缀为6P。
在使用时需要将这个加密秘钥进行口令解密后才能看见实际的秘钥。相当于多了一层保证。

2:P2SH (Pay-to-Script Hash)和多重签名地址
以数字3开头的比特币地址是P2SH地址,有时被错误的称谓多重签名或多重签名地址。他们指定比特币交易中受益人为哈希的脚本,而不是公钥的所有者。资金被发送到3开头的地址时,需要的不仅仅是一个公钥的哈希值和一个私钥签名作为所有者证明。在创建地址的时候,这些要求会被指定在脚本中。这就为多重签名创造了条件。比如需要同时3个人签名才能取款等。

3:比特币靓号
可以让比特币地址前面一些字符具有一定的意义,比如“1kidsXXXXXXXX”。这样显得更独特。但每增加一个字符,难度会增加58倍。

4:纸钱包
将秘钥保存在纸或者其他媒介上的钱包。

***内容参考或出自:***

精通比特币 第二版 中文 Andreas M. Antonopoulos作,乔延宏等翻译,http://book.8btc.com/books/6/masterbitcoin2cn/_book/trans-preface.html

一个关于椭圆曲线密码学的初级读本(相当容易懂) http://8btc.com/thread-1240-1-1.html
知乎 谁能最简单的详解椭圆曲线算法,secp256k1 是如何生成公钥和私钥的? https://www.zhihu.com/question/22399196
谈谈有限域那些事儿 https://blog.csdn.net/qmickecs/article/details/77281602
为什么比特币地址以1开头 http://8btc.com/thread-14607-1-1.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容