上两篇“新手专题”文章,已经分别概述了区块链和加密货币两者。今次讲解的内容也许比较简单,但是钻研起来也可以相当艰深:他们就是公钥(Public Key)和私钥(Private Key)了。
在这篇新手专题当中,你将能够掌握:
- 公钥与私钥
- 从公钥变成钱包地址的过程
- 公钥加密(public-key cryptography)技术
- 公钥加密在加密货币领域的应用范例
(本篇文章牵涉私钥范例。阁下请勿取用私钥范例作储存资产用途,如招致损失,《币讯》概不负责。)
公钥与私钥
如果要使用和交易加密货币,应用公钥与私钥可以说是必须的,而公钥和私钥都是隶属于“密钥”(又称金钥,英文 “Key”)的种类。
在密码学当中,金钥的作用是用作加密(encryption)或者解密(decryption)。如果是在加密过程的话,金钥就是将明文(Plaintext)转化成密文(Ciphertext);相反如果是在解密过程的话,金钥就是将密文转化成明文。除了加密和解密之外,金钥亦可以用于数码签章(Digital Signature)当中,而数码签章跟加密货币应用的关系就更加密切了 - 数码签章的部分,将会留在后面再讲述。
来到这里,我们应该如何理解公钥和私钥呢?如果以比较显浅和笼统的例子说明,就是电子邮件:你拥有一个电子邮件邮箱,只要掌握到电邮地址,那就任何人都可以寄电邮给你,我们可以理解电邮地址就是公钥。但是,电邮邮箱是被锁上的,只有拥有登入密码的人才能够打开电邮邮箱,阅览当中的内容,我们可以理解登入密码就是邮箱钥匙,也就是私钥。
如以更简单的讲法概述,加密货币领域的公钥,是为了负责对外沟通,让外界能够与你接触,包括收取加密货币。私钥就是为了行使权力,包括动用资产的关卡。所以如果让人掌握你的私钥,就等于你“容许”别人用你的钱了。
来到这里,大家也许会问,自己的比特币(Bitcoin, BTC)钱包地址,是不是就直接等于是公钥呢?
- 其实也不完全是。为什么?
从公钥变成钱包地址的过程
大家可以记着一点:比特币的钱包地址,其实是杂凑函式化 / 散列化版本(hashed version)的公钥。那么公钥是如何以杂凑函式,转化成为钱包地址呢?以比特币的平台环境为例,步骤如下:
- 首先,拥有一个 ECDSA(Elliptic Curve Digital Signature Algorithm, 椭圆曲线数字签名算法)私钥,例如是“7BFB502B836AADCF597BD0853A9A4E0F204CFA38AE0785FAEAE73E2F0FA7C80B”。
- 之后,将这个 ECDSA 私钥变成 ECDSA 公钥,即“049147785C2C22C76239ED2E5EF608E973163C3C3628FD9354BEBAD8C592E
0252859E8F210E1D90CA024D76288BF81F30A0739CEFC72BA648183F66A39064E699C”。 - 将以上的 ECDSA 公钥,以 256 位元的 SHA-256(Secured Hash Algorithm 256, 安全杂凑算法 256)算法处理,变成了“6ECB94AB545E92D8A6398423EB8785055C00D8949F99ABF0B3605ABE2214B3EC”。
- 将(3)的结果,以 160 位元的 RIPEMD-160(RACE Integrity Primitives Evaluation Message Digest 160, RACE 原始完整性校验讯息摘要 160)算法处理,变成“227D664438579A216E329751D6507D1C3EF9B5F2”。
- 将(4)的结果,前置一个网络位元(Network Byte)。如果是用于比特币主网,就前置 “00”,使其变成“00227D664438579A216E329751D6507D1C3EF9B5F2”。
- 将(5)的结果,以 SHA-256 算法处理,变成了“83428FEC0372AD1A3D578215708235A44F7A23D0E3EBA77839DD516C1D7EF575”。
- 将(6)的结果,再以 SHA-256 算法处理,变成了“3BCCC78D8C67A0504B0AA54C6D0CB8A258D83307A2B8D12F9DD24FFBB8111E9E”。
- 从(7)的结果取出头四位元的字码,即 “3BCCC78D”。这四位元字码其实是“地址校验码”(address checksum code)。
- 重复填上(5)的结果,并且后置(8),即变成“00227D664438579A216E329751D6507D1C3EF9B5F23BCCC78D”。来到这里,其实已经产生出一条 25 位元,50 字节的二进制比特币钱包地址。
- 最后将(9)的结果,以 “Base58” 编码方式生成正式的比特币钱包地址,即“149NCRz2WHvLTSvTm3iXP1Vg6nu7CgpHmn”。
网上已经有一些把以上过程一键转化的网站,大家不妨试试。另外如果想理解转化过程应用过的各种算法,也可以继续在网上搜寻,这里则暂不讨论了。
在比特币领域当中,不论公钥和私钥,其实都是属于 256 位元的数字。如果以十六进制(hexadecimal)计,公钥和私钥都会是 32 字节(32 bytes),64 字节,例如上面提到,经过 SHA-256 处理的公钥
“6ECB94AB545E92D8A6398423EB8785055C00D8949F99ABF0B3605ABE2214B3EC”。
公钥加密技术
加密货币,是使用公钥加密(public key cryptography)运作。公钥加密又称为非对称加密(asymmetric cryptography)。非对称加密的关键在于,加密过程是透过公钥进行,但是解密过程是透过私钥进行。如果加密和解密都是透过私钥的话,那就是对称加密(symmetric cryptography)了。
以下可以提供一个典型的公钥加密范例:
- Alice 与 Bob 事先互不认识,也没有可靠安全的沟通管道,但 Bob 现在却要透过不安全的互联网向 Alice 传送资讯。
- Bob 撰写好原文,内容是 “Hello Alice!”。原文在未加密的状态下称之为“明文”。
- Alice 使用“密码学安全伪乱数生成器”,产生一对金钥,其中一个作为公钥 c,另一个作为私钥 d。
- Alice 可以用任何方法传送公钥 c 给 Bob,即使 Eve 在中间窃听到公钥 c 都没问题。
- Bob 用公钥 c 把明文 “Hello Alice!” 进行加密,得到密文 “6EB6957008E03CE4”。
- Bob 可以用任何方法传输密文 “6EB6957008E03CE4” 给 Alice,即使 Eve 在中间窃听到密文都没有问题。
- Alice 收到密文,用私钥 d 将 Bob 的密文 “6EB6957008E03CE4” 解码,最终获得 Bob 的明文 “Hello Alice!”。
- 由于 Eve 没有 Alice 的私钥 d,所以 Eve 不知道 Bob 送出的明文内容。
如果 Bob 日后想翻查曾经写过的原文,但又遗失了自己的拷贝,除非她获得 Alice 的私钥 d,否则他的处境就会如 Eve 一样,将以后无法掌握原文。
以上是典型的公钥加密范例。但如果套用在加密货币,例如比特币的交易,情况就会有些不同。
公钥加密在加密货币领域的应用范例
如果大家还记得第一篇“新手专题”文章的内容,我们都曾经提及过如何产生一宗比特币交易。在此想再一次举例,让大家更加明白概念。
处境:大雄收到叮当的 1.2 BTC。现时大雄想将当中的 1 BTC 传给静宜。以下是大雄传送 BTC 给静宜的过程:
- 大雄拥有上一次跟叮当交易的内容,以及静宜的公钥,并变成了一节杂凑函数(Hash)。
- 大雄以自己的私钥签署交易。透过签署造成的数码签章,其实是(1)的所有内容,并跟随在 1 BTC 的末尾。
- 大雄的公钥、1 BTC,以及数码签章,一并进入传输过程。
- (3)的内容已经传输至静宜的钱包。静宜取得了大雄的公钥,并利用它来验证签章的内容,确认大雄是传输 1 BTC 给自己,过程中没有任何篡改。
- 验证完毕,静宜正式获得 1 BTC。
大家看到这里,或者都会留意到静宜其实不需要用上自己的私钥都可以获得大雄给她的 1 BTC。不过,我们仍然会说到 BTC 是使用“公钥加密”方式运作的 - BTC 用到的 ECDSA 算法,其实是公钥加密算法之一。
总结
有一条问题也许不少人都曾经问过:如果不见了钱包的私钥,到底能否透过暴力破解,即利用电脑算力不停运算找出正确答案呢?我们的答案是,几乎不可能。为何是“几乎不可能”呢?因为能够成功破解的机会确实低得惊人,其实是 1 / 2256,也即是 1 / 1.16 x 1077。可以说,能够中六合彩头奖的机会(1 / 1.398 x 107),仍然比找到私钥的机会还要高太多太多。如果还能够找出私钥,也许你已经用上很多辈子的运气……
所以,大家请务必好好保管自己的钱包私钥呢。
以上内容由《币讯》与 9up.io 共同协作撰写。
【若你喜欢币讯的内容,请轻按以下拍手键(可以按几次)支持我们。】