加密货币(Cryptocurrency),利用密码学及数字杂凑而成并与智能合约绑定的新型通证。区块链所有交易内容都是公开的,包括交易内容钱包信息等。
比特币的密码学基础
比特币主要运用了密码学中的两个技术,一个是哈希函数,另一个是签名技术
哈希函数(Cryptographic hash function)
哈希函数是一类函数的统称,这类函数能将任意长度的输入值转变成固定长度的值输出,该值即为哈希值,通常为字母与数字的组合。可以通俗的理解成哈希函数能够把任意长度的字母数字组合压缩成一串固定长度的组合,使其体积变小,但是所包含的内容不变。
哈希函数拥有几种重要的性质:
-
不可逆性(Hiding)
已知哈希函数fn与x的哈希值(即f(x)),无法反向求出x。给定x计算f(x)很好算,但是反着来算在当前计算机能力条件下做不到,因此适合用于加密(补充:量子计算机可以快速计算,此处不展开)
-
抗冲突性(Collision resistance)
由于哈希函数本质是一种映射,即通过一些输出来代表一些输入,而其输出是固定长度,输入是理论上无限长度的,因此理论上会存在多个输入被映射到同一输出上,即存在H(x) = H(y),即为出现哈希冲突或哈希碰撞。
-
但是,在已知哈希函数H(n)和输入x的情况下,人为地寻找一个y,使得H(y) = H(x),在当前计算机能力下几乎不可能。(这同样也是因为其具有不可逆性,在知道H(x)的情况下无法反求该方程的其他解)。
抗冲突性使得哈希函数能够有效防止信息篡改,假设有一个信息m,通过哈希函数获得H(m),也就是该信息的一个摘要(Digest),只要拥有该摘要H(m),便可知道m是否被篡改,可以理解为因为目前无法找到一个被篡改的m’使得H(m’) = H(m),等于只要拿着钥匙回来开门就知道门锁有没有被换,因为没有第二个一模一样的门锁存在,不需要把全副家当都装在身上带着了。
*****注意,抗冲突性并没有数学上的严格证明,只是在实践中被确认。存在过一些被认为是哈希函数的函数最后被人找到快速人为制造哈希碰撞的方法(如知名加密算法MD5)
这两种性质的结合能够实现数字承诺(Digital Commitment)
假设一个人声称可以预测股市,那么证明他的预测能力的最好方法就是让他将对第二天股市的预测装在一个密封的信封当中交由第三方保管,等第二天收盘的时候再打开来验证。
那么换到计算机的世界当中,哈希函数便可以充当这个“信封”的功能:股市预言家对第二天股市的预测为x,通过哈希函数得到这个预测结果的摘要H(x)。由于不可逆性,摘要H(x)不包含任何能够推测出预测内容x的信息,因此不会提前对股市产生影响。这个H(x)可以随意分发传播,等第二天股市收盘的时候,预言家再拿出自己的预测x,我们可以通过函数H(n)来验证这是不是他前一天所做的预测还是今天篡改过的,从而确定其预测是否正确。
-
谜题友好性(Puzzle Friendly)
给定一个输入x,只能通过计算H(x)才能知道y,不像一般的函数比如说简单的二次函数,给定x大概能猜到y在什么范围,或给定y大概能确定x在什么范围。因此,想要得到一个特定的哈希值y,只能一个一个去试x和计算H(x),没有捷径。
比特币挖矿实际上就是在找一个x,使得H(x)能够在某个具体范围内。由于哈希函数的谜题友好性,只能消耗算力不停去试,没有其他方法。但是一旦找到一个x,其他人能够很容易的验证H(x)=y
比特币所用的哈希函数是SHA-256,同时满足这三种性质
签名
日常我们要开户得去银行开户,而去中心化的开户只需要创建一对公钥和私钥。这是一种非对称的加密体系。理解非对称加密体系,首先要理解对称加密体系
-
对称加密体系
一些谍战剧里,总部给间谍传递秘密消息是通过比如说指定一本书,电台播报的数字代表书的第几页第几行第几个字,间谍对照着找到这些字就能将加密信息解读出来,这种发送方(加密方)和接收方(解密方)用的是同一套密码本的加密体系即为对称加密。
这种体系的一个缺点是把密钥(密码本)分发的过程中可能会出现意外情况造成泄漏,比如通过网络发送可能会被窃听
-
非对称加密体系
为了解决对称加密体系的这个缺点,非对称加密体系通过一对密钥的方式来对信息进行加密,即公钥和私钥。加密用的公钥,解密用的私钥,这俩密钥都是针对一个人的。这就使得公钥不保密也无所谓,任何人都可以知道你的公钥,所以任何人都能给你发加密信息,你再用你的私钥解密就行。而当你要回复的时候,就可以用那个人的公钥将消息加密发送给他,他再通过自己的私钥来解密阅读。
比特币系统的账户创建便是在本地系统中产生一对公钥和私钥,公钥类似账号,别人知道可以给你转钱;私钥类似银行密码,拥有者可以对账户进行操作。
事实上,公钥私钥的作用是用来签名验证的。比如说我发布了一条交易信息,我将我账户内的1个比特币转到另一个账户里去,这条交易带有我用我的私钥进行的签名,那么区块链上的其他人可以用我的公钥来验证这条交易确定这个交易确实是我发起的。
可以通过不断产生公私钥来得到一个和链上相同的公私钥从而实现窃取吗?理论上可行,事实上概率很小。