上一篇开场谈到了区块链钱包软件的角色与功能,本篇将开始谈其背后的技术,将分成两篇,此篇先说明以下功能。

1、创建私钥、地址 2、传递讯息

这边就先略过了两个功能的需求与目的,直接介绍其背后的技术原理。当然,你也可以回上一篇看一下,帮助后续的理解。

创建私钥、地址

创建流程

以创建地址的角度来说,整体是一个流程,过程中会有三个产物:私钥、公钥与地址。

本人手工制,引用请注明出处。

[1]透过密码学SHA-256算法随机生成一个随机数,把它用来当作密码,称作私钥Private Key。

[2]将私钥,透过椭圆曲线密码学对应生成公钥Public Key。

[3]再将公钥,进行SHA-256散列等编码得到地址Address。

生成的流程是单向运算的,是不可逆的,公钥无法反推出私钥,地址无法反推出公钥。这样的特性,让钱包软件所生成的公钥与地址,可以在区块链上公开使用,即使任何人取得某个公钥或是地址,也无法推算出其私钥。

你可能早已知道私钥与地址的作用,那公钥是干嘛的呢后面会提到

视觉化地址生成器 http://royalforkblog.github.io/2014/08/11/graphical-address-generator/

地址生成方式会有不同

从区块链的角度来看,不同的区块链或是同一个区块链,都会有地址协议的不同的状况,于是钱包软件就需要针对性的设计,不同的地址生成方式。

不同的区块链,例如:比特币与以太坊,两者的地址协议是不同的,

比特币地址:1Bn3YxHMpQod86v1kUKQDtgzqJSoWqNpax 以太坊地址:0x9f8b6c492cb8e97c77fbdb6cb2e31d6c808148a2

若某区块链进行节点软件更新时,新版有着不同于旧版的地址协议,并且新旧版本互相兼容(新版本向后兼容/软分叉),就会造成同一个主链有着不同的地址协议。

比特币有三种地址协议 Legacy(1开头):1Bn3YxHMpQod86v1kUKQDtgzqJSoWqNpax Nested SegWit(3开头):3FnuwRTns9VMBD3JQwVJyGRLEosGKY8tqn Native SegWit(bc1开头):bc1qlaf8k2xqj64dxszgzmh8x7uqzawe0x5va6ykvl

对于钱包软件而言,一个私钥只会生成一个公钥,至于公钥生成地址时,是可以用同一个公钥,对应不同地址协议,而生成不同地址的。

传递讯息

要了解钱包软件与区块链的讯息沟通方面,需要先知道区块链的运作方式。

开放的点对点网络

区块链是一个开放的资讯交换网络体系(P2P Network),任何参与者都可以发出交易讯息,也可以自由承接链上的任何交易需求,进行处理,也因为开放的网络环境之下,需要可靠且安全的验证讯息机制。

密码哈希函数:确保收到的交易讯息是正确或完整的。 数字签名:确保交易讯息非假冒身份者所发出的。

假冒身份 恶意者佯装成A地址的所有者,发出交易讯息,要求将A地址的加密货币转入自己的地址中。

密码哈希函数Cryptographic Hash Function

讯息透过运算函数计算出一组字串,而这组字串可用于验证讯息是否有被修改过,或是讯息是不完整的。

我先说明验证流程,假设A端要传一封讯息给B端:

本人手工制,引用请注明出处。

❶ A端将讯息Message,透过哈希函数运Hash( )运算出讯息摘要Message Digest。

❷ A端将讯息与讯息摘要一同传送给B端。

❸ B端拿到讯息后,将讯息透过哈希函数运算出讯息摘要。

❹ B端比对收到讯息摘要跟自己运算出来的,是否是一样的。

哈希函数算出来的讯息摘要,具有一个特性,不管来源讯息有多小的更动,只要有更动,就会运算出不一样讯息摘要,请见以下范例:

原来的讯息:王小明转100元谢小美 讯息摘要:3009980c55ae9a33b175612866c0a7b0bfe01298aeea0ca4631bf3007d38caac将王与小之间,增加空格。 修改后的讯息:王小明转100元谢小美 讯息摘要:6203d40e264b1d24a4b03c0f5e6c26e0dbdbf4692d8bfea5b2de6411f6fcd24b

所以利用比对讯息摘要,就可以辨识收到的讯息,是否在传输层Transport Layer中有被修改过,或是有不完整的情形,但它也仅为这样作用而已,它无法确认讯息来源是否为假冒身份者,例如:谢小美可以发出「王小明转100元谢小美」交易讯息,并附上可成功比对的讯息摘要。

数字签名Digital Signature

来源端在传递讯息时,一并提供自己的数字签名,让接收端透数字签名确认,讯息是来源端所授权的,并非假冒身份者。

对应前述的验证流程,其实就是在传输层中,利用数字签名替代讯息摘要,如下:

本人手工制,引用请注明出处。

❶ A端先将自己的公钥Public Key提供给B端。

❷ A端将运算出的讯息摘要,透过自己的私钥Private Key,执行签名运算Sign( ),产生了数字签名Signature。

❸ A端将讯息与数字签名一同传送给B端。(上图省略了讯息的传输示意)

❹ B端利用收到的数字签名与A端公钥,解密出讯息摘要。

透过A端私钥所运算出的数字签名,只有A端公钥能解开,反面来说,A端公钥是解不开其他人的数字签名,所以B端就能确保签名来源是A端所发出的,非假冒身份者。当然,最后一个解密运算步骤,是算不出A端私钥的,可以保全A端不会外流私钥。

整合上述两个流程

简化来说,A端发出讯息与自己的公钥,并附上自己的数字签名(私钥加密),B端接受后,用A端公钥解密数字签名,若解开了代表讯息是A端所授权的,非假冒身份者,然后再验证讯息摘要,若是一样,就可以确保讯息是正确且完整的。

回归到钱包软件的部分,假设A端是钱包软件,就必须有执行哈希函数Hash Function与数字签名Digital Signature的能力!