笔记 | 普林斯顿公开课《比特币和数字货币技术》1.1

公开课地址:https://www.coursera.org/learn/cryptocurrency/home/welcome

第一周:密码学和加密货币介绍

章节1.1笔记:密码学哈希函数

哈希函数H(x):
1、任意字符串作为输入
2、固定长度输出(比如256bit)
3、计算效率高

安全属性:
1、免碰撞 collision-free
2、隐藏性 hiding
3、迷惑性 puzzle-friendly

免碰撞是指:没有人能找到x != y,使得H(x) = H(y)。
注意:免碰撞(不会碰撞)不是无碰撞(没有碰撞)。因为哈希函数压缩了信息,所以碰撞是必然存在的,只是,发生的概率足够低,低到和下一秒钟地球毁灭的概率(显然,没有发生)一样“不可能发生”。

注意:没有任何一个哈希函数被证明是免碰撞的(collision-free)!
嗯,请注意这里的逻辑陷阱。有一些哈希函数,我们相信它们是免碰撞的,但是无法证明。

免碰撞的应用场景:消息摘要。
当我们看到H(x) = H(y),我们就可以假设x = y。摘要相同,即可认为原始数据相同(未被篡改)。
很有用,因为H(x)的字节数很小,远小于原始信息x。

隐藏性是指:知道H(x),不可能逆向算出x。

但是注意:不能被逆算的前提是,x要有很大的分散度。否则就无法做到这一点。
比如x只可能取两个值,抛硬币的正面或反面。那么就很容穷尽x的可能值的哈希,然后在看到哈希值的时候就能够逆向推出x的值。

所以,要达到好的隐藏性,需要这么做:
引入一个具有非常高的min-entroy(最小熵,高的最小熵意味着该分布很稀疏)的概率分布取值r,然后用r和x按位bitor,记为r|x,然后对r|x计算哈希即H(r|x)。

隐藏性的应用场景:commitment(承诺)。

承诺一个数字,“密封在信封里”,把信封摆在众目睽睽之下。之后某个时间,“打开信封”,揭示这个数字。重要的是,大家都相信,后来大家看到的数字的确就是最初密封的数字。

定义两个API:
1、commit(msg) => (com, key)
2、verify(com, key, msg) => match
于是:
1、密封消息的方法:计算commit(msg),公布com(但暂不公布key)。
2、打开信封的方法:公布key和msg,每个人都可以使用verify来验证msg就是之前密封的msg(承诺)。

安全性要求:
1、隐藏性:com被公布后,无法逆推出原始消息msg。
2、绑定性:无法伪造另外一个消息msg',能够通过verify的验证,即verify(commit(msg), msg') => true。

符合上述安全性要求的API便可以使用哈希函数来实现:
1、commit(msg) := (H(key|msg), key), 此处key是256-bit随机串。
2、verify(com, key, msg) := (H(key|msg) == com)

迷惑性是指:已知y,无法找到x,使得H(r|x) = y,其中r是高度随机数。

迷惑性的应用场景:找数。

给定一个“谜题”值id,以及目标集合Y,找到一个“解”x,使得H(id|x) in Y。

迷惑性意味着,没有任何解题策略,能够比随机猜测更好。

SHA-256哈希。

QY 2018-03-15

你可能感兴趣的:(笔记 | 普林斯顿公开课《比特币和数字货币技术》1.1)