全链社将尝试一种新做法,将链行业的既有资讯以专题的形式展示,为读者提供不一样的思考角度。
本期专题:密钥
本文原标题:私钥和公钥
一个比特币钱包中包含一系列的密钥对,每个密钥对包括一个私钥和一个公钥。
私钥(k)是一个数字,通常是随机选出的。
有了私钥,我们就可以使用椭圆曲线乘法这个单向加密函数产生一个公钥(K)。
有了公钥(K),我们就可以使用一个单向加密哈希函数生成比特币地址(A)。
私钥、公钥和比特币地址之间的关系如图所示
私钥
私钥就是一个随机选出的数字而已。
一个比特币地址中的所有资金的控制取决于相应私钥的所有权和控制权。在比特币交易中,私钥用于生成支付比特币所必需的签名以证明资金的所有权。
私钥必须始终保持机密,因为一旦被泄露给第三方,相当于该私钥保护之下的比特币也拱手相让了。
私钥还必须进行备份,以防意外丢失,因为私钥一旦丢失就难以复原,其所保护的比特币也将永远丢失。
比特币私钥只是一个数字。
你可以用硬币、铅笔和纸来随机生成你的私钥:掷硬币256次,用纸和笔记录正反面并转换为0和1,随机得到的256位二进制数字可作为比特币钱包的私钥。该私钥可进一步生成公钥。
从一个随机数生成私钥
生成密钥的第一步也是最重要的一步,是要找到足够安全的熵源,即随机性来源。
生成一个比特币私钥在本质上与“在1到2256之间选一个数字”无异。只要选取的结果是不可预测或不可重复的,那么选取数字的具体方法并不重要。
比特币软件使用操作系统底层的随机数生成器来产生256位的熵(随机性)。
通常情况下,操作系统随机数生成器由人工的随机源进行初始化,也可能需要通过几秒钟内不停晃动鼠标等方式进行初始化。
对于真正的偏执狂,可以使用掷骰子的方法,并用铅笔和纸记录。
更准确地说,私钥可以是1和n-1之间的任何数字,其中n是一个常数(n=1.158*1077,略小于2256),并由比特币所使用的椭圆曲线的阶所定义。
要生成这样的一个私钥,我们随机选择一个256位的数字,并检查它是否小于n-1。从编程的角度来看,一般是通过在一个密码学安全的随机源中取出一长串随机字节,对其使用SHA256哈希算法进行运算,这样就可以方便地产生一个256位的数字。
如果运算结果小于n-1,我们就有了一个合适的私钥。否则,我们就用另一个随机数再重复一次。
公钥的表示方法
公钥从私钥通过 椭圆曲线乘法计算得到。
公钥的几何意义,是在曲线上的一个点,由一对坐标组成。即公钥被定义为一个点 K = (x, y)。公钥通常表示为前缀04紧接着两个256比特的数字。
如果公钥坐标取下面的值:
x=F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A
y=07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB
则该公钥表示为:
K=04F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE 52DDFE2E505BDB
公钥的格式
公钥常见的有两种格式,一种是未压缩格式公钥。另一种是压缩格式公钥。
引入压缩格式公钥是为了减少比特币交易的字节数,从而可以节省那些运行区块链数据库的节点磁盘空间。
未压缩格式公钥使用04作为前缀,而压缩格式公钥是以02或03作为前缀。
总的来说还是一句话,一定要保护好自己的私钥。
你可能会感兴趣的其他热文
回复下方关键字 迅速查看往期专题
【被误解的区块链】|【区块链实质性应用】|【共识机制】|【区块链】|【侧链】|【闪电网络】|【日本与区块链】|【超级账本】|【智能合约】|【中本聪】|【以太坊】|【比特币】|【安全】|【挖矿】|【去中心化】
领取专属 10元无门槛券
私享最新 技术干货