比特币的所有权是通过数字密钥、比特币地址和数字签名来确定的。
大多数比特币交易都需要一个有效的签名才会被存储在区块链。只有有效的密钥才能产生有效的数字签名,因此拥有~密钥副本就拥有了对该帐户的比特币的控制权。
一般情况下,比特币地址由一个公钥生成并对应于这个公钥。然而,并非所有比特币地址都是公钥; 他们也可以代表其他支付对象,譬如脚本
公钥加密和加密货币
比特币正是使用椭圆曲线乘法作为其公钥加密的基础。
在比特币系统中,我们用公钥加密创建一个密钥对,用于控制比特币的获取。密钥对包括一个私钥,和由其衍生出的唯 一的公钥。公钥用于接收比特币,而私钥用于比特币支付时的交易签名。
支付比特币时,比特币的当前所有者需要在交易中提交其公钥和签名(每次交易的签名都不同,但均从同一个私钥生成)。
大多数比特币钱包工具为了方便会将私钥和公钥以密钥对的形式存储在一起。然而,公钥可以由私钥计算得到, 所以只存储私钥也是可以的。
私钥和公钥
私钥是一个数字,通常是随机产生的,有了私钥后,使用椭圆曲线乘法这个单向加密函数产生一个公钥,有了公钥后,我们就可以使用一个单向加密哈希函数生成比特币地址
私钥
在比特币交易中,私钥用于生成支付比特币所必需的签名以证明对资金的所有权。
生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。
私钥可以是 1 和 n-1 之间的任何数字,其中 n 是一个常数(n=1.158* 10^77,略小于 2^256),并被定义为由比特币所使用的椭圆曲线的阶。从编程的角度来看,一般是通过在一个密码学安全的随
机源中取出一长串随机字节,对其使用 SHA256 哈希算法进行运算,这样就可以方便地产生一个 256 位的数字。如果运算结果小于 n-1,我们就有了一个合适的私钥。
公钥
通过椭圆曲线乘法可以从私钥计算得到公钥,这是不可逆转的过程:K = k * G 。G 是被称为生成点的常数点
比特币使用了 secp256k1 标准所定义的一种特殊的椭圆曲线和一系列数学常数。
生成点是 secp256k1 标准的一部分,比特币密钥的生成点都是相同的
大多数比特币程序使用 OpenSSL 加密库进行椭圆曲线计算。例如,调用EC_POINT_mul() 函数,可计算得到公钥。
地址
比特币地址可由公钥经过单向的加密哈希算法得到。
由公钥生成比特币地址时是 SHA256 和 RIPEMD160使用的算法是
A = RIPEMD160(SHA256(K))
公式中,K 是公钥,A 是生成的比特币地址。通常用户见到的比特币地址是经过“Base58Check”编码的。
Base58 和 Base58Check 编码
Base64
使用了 26 个小写字母、26 个大写字母、10 个数字以及两个符号(例 如“+”和“/”),用于在电子邮件这样的基于文本的媒介中传输二进制数据。
Base58
由不包括(0,O,l,I)的大小写字母和数字组成。
Base58Check 是一种常用在比特币中的Base58 编码格式,检验和是添加到正在编码的数据末端的额外 4 个字节。
使用 Base58check 编码时,解码软件会计算数据的校验和并和编码中自带的校验和进行对比。
在比特币中,大多数需要向用户展示的数据都使用 Base58Check 编码,可以实现数据压缩,易读而且有错误检验。
Base58Check 编码中的版本前缀是用来创造易于辨别的格式,
密钥的格式
私钥的格式
不同的格式用在不同的场景下。十六进制和原始的二进制格式用在软件的内部,很少展示给用户看。WIF 格式用在钱包之间密钥的输入和输出,也用于代表私钥的二维码(条形码)。
公钥的格式
公钥通常表示为前缀 04 紧接着两个 256 比特的数字。其中一个 256 比特数字是公钥的 x 坐标,另一个 256 比特数字是 y 坐标。前缀 04 是用来区分非压缩格式公钥,压缩格式公钥是以 02 或者 03 开头。
如果我们知道了x,就可以通过公式求出y的坐标,从而将存储空间减少256比特。02表示y是偶数,03表示y是奇数
"压缩格式私钥”是一个不当用词!私钥不是压缩的。WIF 压缩格式的私钥只是用来表明他们只能被生成压缩的公钥和对应的比特币地址。相反地,“WIF 压缩” 编码的私钥还多出一个字节,因为这种私钥多了后缀“01”。该后缀是用来区分“非压缩格式”私钥和“压缩格式”私钥。