之前在大三的时候上过网络安全技术的课程,学习过比特币的知识,从密钥生成,交易,挖矿到钱包等都有了一定了解,最近想静下心来重新系统地学习一遍比特币,为之后的研究打下基础,所以在学习过程中会做一点笔记,方便之后回顾。本篇将会介绍比特币的一些基础概念。

私钥

比特币的私钥为256位bit的数,大小范围是1到n,其中n是一个常数(n约等于1.158 * 10^77,略小于2^256),由ECDSA spec256k1算法限定,n的准确值为(16进制):

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140

要生成比特币私钥,我们随机选择一个256bit的数字,并检查它是否小于n。如果运算结果小于n,我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。从编程的角度来看,一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256bit的数字。

以下是一个随机生成的私钥k(16进制):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

公钥

通过椭圆曲线乘法可以从私钥计算得到公钥K,这是不可逆转的过程:K = k * G 。其中k是私钥,G是被称为生成点的常数点,而K是所得公钥,这里的*非正常定义下的乘法,而是所定义的阿贝尔群中的乘法。G点的坐标为

79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, 483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

以私钥k为例,得到的公钥K为

F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A,
07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

关于椭圆曲线密码的计算将会再开一篇文章详解。

比特币地址

比特币地址是一个由数字和字母组成的字符串,由公钥生成,一般以数字“1”开头,比如

1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy

在交易中,比特币地址通常以收款方出现。如果把比特币交易比作一张支票,比特币地址就是收款人,也就是我们要写入收款人一栏的内容。比特币地址可以代表一对公钥和私钥的所有者,也可以是一个脚本,比如需要多个人的签名才能取出这笔钱(P2SH)等等。

比特币地址可由公钥经过单向的加密哈希算法得到,以公钥 K 为输入,计算其SHA256哈希值,并以此结果计算RIPEMD160哈希值,得到一个长度为160位(20字节)的数字A:

A = RIPEMD160(SHA256(K))

接着使用Base58Check进行编码, 就可以得到比特币地址。Base58Check的具体计算会另开一篇文章。