1.背景
比特币是一种加密货币,但其中的“加密”概念和传统的加密概念并不相同。
传统密码学的加密主要分为对称加密和非对称加密,两种加密的方式以密钥的不同来作为区分。对称加密加解密方使用相同的密钥进行加解密,常见的加密算法有DES、AES等。非对称加密加解密方使用公私密钥对进行加解密。公钥用于加密,私钥用于解密,常见的算法有RSA、DSA、ECC。
而比特币中的加密主要是使用了密码学中的哈希和签名这两个概念。
2. 比特币中的密码学
2.1 哈希
哈希算法的概念是,将任意长度的输入数据转换为固定人长度的输出(哈希值)。可以理解为一个函数: ,n为任意长度,c为一个固定值。
这样的函数有一些特点:
- 固定长度输出:无论输入的数据有多大,哈希算法生成的哈希值是固定的
- 不可逆性:通过哈希值,几乎不可能找到输入值
- 唯一性:不同的输入数据经过哈希计算后的值应该是唯一的。
在比特币中的哈希函数,应该是加密哈希函数(cryptographic hash function), 这就要求哈希函数必须具有以下的几种性质:
- Collision resistance(哈希碰撞)
哈希碰撞抗性:一个哈希函数如果具有哈希碰撞抗性,那么给定x,y,x≠y, 不能轻易实现H(x) = H(y)。
不能轻易实现并不是指不能实现,因为哈希函数的输入空间是无限大的,而输出空间是有限的,那么就有可能会有两个不同的输入得到一个相同的输出。
目前并没有人为制造哈希碰撞的算法,但也没有哈希算法能被证明是Collision Resistance。例如,MD5算法就已经被发现可以人为制造哈希碰撞。
我们理想的哈希算法就是:想要目前想要制造哈希碰撞,只有使用穷举的方法。同时如果我们hash函数的输出空间足够大,那么使用穷举方法也是几乎不可能制造出哈希碰撞。
在指定哈希输出空间时,2^256的输出空间,往往穷举2^130 次就能很大概率制造哈希碰撞,这个现象叫做生日悖论(birthday paradox)
哈希碰撞的用途:消息摘要 Message Digest
- Hiding
给出哈希值y = H(x),没有有效的方法能够推断出x的值是多少。
要满足这个特性,需要x属于一个非常宽泛的集合,才能够不被穷举法试出结果。但是我们可以通过使用一个秘密值(secrect value)r来让函数满足这个特性。此时,哈希函数变成了H(r||x),
r是取自一个随机数集合,这个集合需要满足最小墒min-entropy特性。
最小墒:最小墒是衡量一个随机函数的可预测性。越高的最小墒可以创建出更广泛的随机分布
Hiding特性的应用
digital commitment:专家预测股票结果,预测影响结果,使用sealed envelope用来防止这种影响
选择一个随机数nonce,nonce是一个256bit的随机值
利用到hiding的特性,给出H(nonce||msg),不能够找到msg是什么,因此不能篡改msg信息;同时,利用hash函数的collision resistance特性,不能找到msg‘和nonce’,得出和H(nonce||msg)相同的哈希值,因此也不能伪造信息。
- puzzle friendly (加密货币中特有性质)