比特币被称作是加密货币,但实际上加密货币是不加密的,区块链上所有的交易内容都是公开的,包括账户的地址、转账的金额等等。比特币中主要用到密码学中的两个内容:哈希和签名。
哈希
密码中的哈希函数被称作:cryptographic hash function,它有两个重要的性质:collision resistance和 hiding 。
collision resistance
其中的collision是指哈希碰撞,什么是哈希碰撞?
若有哈希函数H(),假设两个输入 x , y 且 x 不等于 y ,使得H(x) = H(y),则称为哈希碰撞。
collision resistance 的解释是:Collision resistance is a property of cryptographic hash functions: a hash function H is collision resistant if it is hard to find two inputs that hash to the same output; that is, two inputs a and b such that H(a) = H(b), and a ≠ b.
it is hard to find 意思是很难找到两个不同的输入使得二者的哈希值相等,也就是说想要人为地制造哈希碰撞是非常难的,但哈希碰撞是客观存在的,例如当我们使用哈希表的时候,不同的输入可能会被映射到哈希表中的同一个位置,因为输入空间大于输出空间。
那么collision resistance这个性质有什么用呢?
它可以用来对一个massage求digest,例如有一个massage m ,取它的哈希值H( m )作为digest 用来检测m是否被篡改,因为当m被篡改时,它所对应的哈希值H(m)就会发生变化,而根据collision resistance性质可以知道,很难找到另一个输入m ' 使得H( m ' ) =H( m ),因此想要篡改内容而不被检测出来几乎是不可能的。
举个例子:你想要把一个文件存到云存储服务上,当你某一天要用需要下载回来的时候,如何确定下载的文件就是当初保存的那份文件呢?这时就可以用到哈希函数的collision resistance性质,在上传的时候用文件的内容作为输入算一个哈希值出来,保存到本地,将来取文件的时候再算一个哈希值出来,与原先本地的哈希值进行比较,如果一致则说明文件没有被篡改。
但需要注意的是,哈希函数的 collision resistance 这一性质从理论上是无法证明出来的,它是由实践经验得出的,而有的哈希函数则可以人为地制造哈希碰撞,很著名的一个例子就是MD5,它之前是一个很流行的哈希函数,当初人们认为它很安全,但是现在已经能够人为地制造哈希碰撞了。
hiding
这一性质是指哈希函数的计算过程是单向的、不可逆的。
意思是给定一个输入 x ,可以算出它的哈希值H(x),但无法根据哈希值H(x)反推出原来的输入x ,也就是说,哈希值H(x)没有泄露有关输入 x 的任何信息。
但是仔细一想,真的就没有办法通过H(x)反推出 x 吗?其实是可以通过蛮力求解的方法得出输入 x 的,只要把输入所有可能的取值遍历一遍,将每一个取值的结果与目标H(x)作比较,直到找到相同的结果就可以知道对应的输入了。
因此,hiding这一性质成立的前提是输入空间要足够的大,使得上述这种蛮力求解的方式行不通,而且输入的分布要比较均匀,各种取值的可能性是差不多的。这一点很好理解,因为即使输入空间足够大,但是如果常用的输入都比较集中在某一些值,那么也是可以通过蛮力破解的。
hiding这一性质有什么用呢?
hiding可以和collision resistance 这一性质结合在一起用来实现 digital commitment,有时候也把它称作 digital equivalent of a sealed envelope,直译过来可以理解为 数字加密信封。
举个例子来说明下sealed envelope(加密信封)在现实生活中的意义:比方说有一个人,他想要预测第二天的股票是否会涨,那么如何来证明他的预测是否是准确的呢?
一种方法是,他提前一天对外公布第二天的某某股票会涨,等到第二天的结果出来后再判断他的预言是否准确,那么这种方法是否存在问题呢?如果这个人是股票界的权威人士,那么他的预测势必会直接影响到第二天股票是否会涨,可能使得原本不会涨的股票反倒涨了。
这说明预测结果不能公开,那如果预测结果不公开,等到第二天结果出来后再公开,那又如何保证预测的结果是否被篡改过呢?这就需要用到sealed envelope,将预测结果写下来,放入一个信封,把信封交由第三方公证机构保管,等到第二天结果出来后再验证预测是否准确。这就是现实生活中sealed envelope的用处。
那在电子世界中,如何实现一个digital sealed envelope呢?
将预测结果作为输入 x 算出一个哈希值,将这个哈希值公布出去,由于hiding这个性质,只知道公布的哈希值是无法反推出输入,也就是预测结果;而又由于collision resistance性质,使得输入无法被篡改,因为输入一旦篡改,得出的哈希值就会和当初公布的不一样。这就起到了digital sealed envelope的功能。
但在实际操作中有一些细节需要注意,因为hiding性质的前提是输入空间要足够大,分布要比较均匀,而在上述股票预测的例子中,它的输入空间却不是足够大,因为股票的支数是有限的。常用的解决方法是:在输入后面拼接一个随机数作为整体取哈希,来保证拼接之后的输入足够随机,分布足够均匀。