提到区块链的不可篡改性和去中心化,相信许多人会和我产生一样的疑惑:没有第三方、不须仲介代办的去中心化应用,的确可以省去很多时间成本,可是那要怎么确保不经手第三方的资料没被动过手脚?没有银行,一笔交易的真伪如何认证?
如果去中心化不能解决以上认证、防伪的问题,那区块链的不可篡改性也只不过是一堆不可篡改,但是也无凭无据的交易。
所以Cryptography (密码学)和Hash Function哈希值)就诞生了!是这两个重要的技术赋予区块链的不可篡改性和去中心化意义。
在资讯发达的现在,密码学其实隐藏在我们日常生活中的每一处,像是登入邮件、社群…等等都需要输入一个专属于自己的密码一样,而久远以前罗马人说的Kryptosgraphia(密码学) 也就是Kryptos (hidde) + Graphia (message) 隐藏的讯息,是不是很有趣呢?
而区块链使用的密码学技术是Public Key Cryptography (公钥密码学),又称Asymmetric Cryptography (非对称式密码学)。从Public Key (公钥)可以知道必定也有Private Key (私钥)的存在,公私钥的区别就在私钥不可以给别人看,要自己保管好;而公钥则是一个可以公布给所有人知道的资讯。
公私钥匙都可以进行encryption (加密)或decryption (解密),并且两两配对(故称非对称式密码学),一个私钥产生一个公钥,且只有成对的公私钥可以互相解密。
当公钥加密成为锁,私钥就是他的解,反之亦然,形成两种不同的资安用途:
例如:Alice 要传送银行资料给Jack,她用Jack的公钥加密,而Jack公钥的解锁就是Jack的私钥,代表说这项银行资讯只有Jack有办法解密阅读。
2. 私钥加密,公钥解密:保护公钥持有者,证明发布人(私钥拥有者)的正当性。
例如:Digital Signing (数字签名)。Jack是一家公司老板,今天他想以他的名义发布讯息给大众,要如何确保是Jack老板本尊发布的呢?只要Jack用他的私钥加密,接下来知道Jack公钥的大众便可以解密得到资讯。
注意:这里使用公私钥的目的就和第一种保护机密讯息不同,而是为了要确保发布人的资讯没有在传送途中被窜改,因为要是被窜改,大众用Jack公钥时便会解密失败。

更简而言之来说,使用公钥加密时有如我们的邮筒,让任何人都可以寄送想保密的资料给我们,只有拥有邮筒钥匙的我们可以看到讯息; 另一方面,用私钥加密目的在确保发布人身份,功用如同digital signature (数字签名)。
什么是区块链的哈希函数?请看下图秒理解。
没错,区块链的哈希函数就是一个可以接收各种档案形式(数字、文字、图像、影片、电子书、合约…等等)、档案大小,并且经过杂数方程式运算,压缩后,丢出一串固定大小的数字。
「咦,数字?我怎么还有看到英文。」
因为哈希函数是以十六进位为基础,不同于我们生活中每天在用的十进位,十六进位在1~9之后代表的数字10~15,就是ABCDEF。
哈希函数其实就像是杂数方程式,跟数学方程式一样有多到数不清种样子,可能是x+y=?最简单的加法,当然也可能如此复杂。
哈希函数也有非常多种,随便举几个例子MD5 (128-bit) 、 SHA-256 (256-bit) 、 SHA-512 (512-bit) 。括弧中的几bit代表档案压缩后,产出那串数字的大小,而bit越大代表可能产生的数字越多种,区块链也就越安全。试想要是今天档案压缩后只有2²=4种可能,跟另一个256 bits的哈希函数大约有2²⁵⁶=1.15 x 100000000000000000000000000000000000000000000000000000000000000000000000000000(没错,有77个0这么多)种可能相比,哪个更安全,更不容易被骇客破解呢?
哈希函数除了可以把各种档案压缩成一串串大小相同的数字外,他还有几样特色:1.产出非常迅速,好奇的朋友可以亲自玩玩看SHA-256哈希函数; 2.即使只是相差一个字,出来的数字相差十万八千里(试着输入dog和dog3,看看会发生什么事!)所以如果智能合约里有一个标点符号、一个英文单字、或是一个数字被改变,都会立刻被发现;
3.最后也是最重要的一点,真的很重要,区块链使用的哈希函数是一种one-way(单向)方程式,也就是说没有人可以从产出的那串密码回推原始档案,有没有觉得好像似曾相似?没错,前面提到私钥产出公钥的过程,就是利用哈希函数运算的结果,所以不需要在公开公钥给大众后,担心自己的私钥会有被破解的一天。在这里真的要向想出应用这个运算法则在区块链上的聪明工程师们致敬。
区块链有了公私钥确认身份,又有杂数方程式迅速产生单向的加密数字,让没有第三方的区块链也能真正做到交易认证和防伪。