0%

BTC一---密码学基础

密码学基础

1.哈希

​ 比特币属于加密货币,但是区块链上所有的交易都是公开的,包括账户的地址,转账的金额。

比特币用到了密码学的两个内容:哈希和签名

哈希在比特币中:cryptographic hash function

它在密码学中要求的两个性质:

​ ①collision(哈希碰撞) 和 resistance:没有什么高效的方法人为的制造哈希碰撞,

​ 解释为对于一个x,没有什么高效的办法,找到另一个y,使H(x) = H(y)

​ 用法:对于一个m,哈希值为H(m),没有办法篡改内容,而又不被检测出来,因为找不到另外一个m’,使得H(m) = H(m')

​ 在理论上,这个性质是证明不出来的,只能依靠实际的经验 例如:md5,我们以前没有办法找到制造哈希碰撞的办法,然而现在却可以。

如果我们有一个256位的哈希值,他的输出空间就为2^256,但是输入空间是无限的,根据鸽笼原理(抽屉原理),必然会导致哈希碰撞。

hiding:哈希函数的计算过程是单向的,不可逆的,x可以计算得到H(x),但是H(x)计算不出x,也就是说,H(x)哈希值没有泄漏x的信息。

这个性质的前提是,x的输入范围要足够的大,使得蛮力,遍历破解的方法是不可行的,输入的分布还要比较均匀,各种取值的概率差不多。

将预测结果作为x,算出一个哈希值,将这个哈希值可以公布出去,因为有hiding的性质,只知道这个哈希值,是不能知道预测结果是什么的,在第二天收盘之后,再将预测值公布出去,因为存在collision resistance的性质,这个预测结果是不可能的被篡改的,这就是一个sealed envelope的功能。

x—->H(x)

在实际操作中,不是直接对x取哈希值,而是再x后面加上一个nonce(随机数),保证x的随机性,和分布均匀

哈希函数除了在密码学中要求的这两个性质之外。

在比特币中还要求puzzle friendly

哈希值的计算结果是不能被预测的,如果想要得到某个范围之间的哈希值,只能一个一个输入结果去试

那这个性质为什么叫puzzle friendly

在比特币中的挖矿:实际上就是找一个nonce(随机数),这个nonce和区块的块头里的其他信息,合在一起,作为输入,取出一个哈希,这个哈希值要小于等于某个指定的目标阈值

比特币即区块链,区块链是一个一个区块组成的链表,每个区块有一个块头,块头中有很多的域,其中有一个域是我们可以设置的nonce,挖矿的过程就是不停地去试不同的随机数,使得整个块头取哈希值之后落在指定的范围之内(<=target space)。

puzzle friendly 就是说挖矿的过程,没有捷径,只能靠不停地去试大量的nonce,才能找到符合要求的解,所以这个过程才可以被称为“工作量证明(proof of work)”,你找到了nonce,一定是你做了大量的工作,因为没有别的捷径。

虽然挖矿的过程需要大量的工作量,但是只要找到了符合要求的nonce,将这个nonce发布出去,其他人要验证这个nonce是很容易的,只要算一次哈希值就行了。这个就叫做“difficult to solve ,but easy to verify”。

比特币中用到的哈希函数叫做SHA-256。

SHA:secure Hash Algorithm

我们上面所说的三个性质,他都是满足的

2.签名

比特币账户中的账户管理,在日常生活中,可以去中心化的管理机构,比如银行办理手续,

但是在比特币中是去中心化的,那么怎么办理账户呢:每个用户自己决定开户 ,不需要任何人批准,

开户的过程很简单,就是创建一个公钥和私钥的对。

公私钥是来源于非对称加密体系:asymmetric encryption algorithm

最早的加密体系是对称的:symmetric encryption algorithm —->两个人之间要进行通讯,但这个过程可能是被窃听的,所以我们两个人之间商量一个密钥,用来加密,发送信息,再用这个密钥来解密,因为这个加密和解密的密钥用的是同一个,所以被称为对称加密体系,这个前提是,有某种安全的渠道,可以把这个密钥分发给通讯的双方(这也是对称加密的一个弱点,密钥的分发不是很方便)

非对称加密:加密用公钥:public key ,解密用私钥: private key,我要把信息传给你,用你的公钥对信息加密,你收到信息,再用你的私钥解密,得到信息,需要注意的是,加密解密用的公钥私钥,都是接收方的,好处是什么?

大家都可以知道我的公钥,都可以给我发消息,但是私钥是保存在本地的,不用传给对方,这就解决了对称加密过程,密钥分发带来的不方便的问题

所以比特币创建账户,就是在本地创建一个公钥私钥对,这个公钥就相当于银行账户,私钥相当于银行账户密码,知道私钥就可以把账户上的钱转走。

比特币虽然叫加密货币,但是其实他是不加密的,信息都是公开的,那我们要这个公钥私钥干嘛?

实际上就是用来作签名,在我转比特币给另一个账户的时候,别人怎么知道是不是我转的,还是别人冒名顶替转的?

这个时候就需要我用私钥再这个信息上做一个签名,别人再用我的公钥验证我的私钥生成的签名

万一两个人创建的比特币账户的公私钥对相同怎么办?如果是256位的哈希,产生相同的公私钥对的概率是微乎其微的,

这个概率比地球爆炸的概率还要小!

在生成比特币账户的公私钥的时候,假设前提是我们有一个好的随机源,如果随机源不好,那么这个时候还是有可能两个人的公私钥是相同的,其实不仅是生成账户的时候,在签名的时候也需要有好的随机源!

3.总结

密码学中,两个功能,一个是哈希,一个是签名,这两个功能是可以结合起来使用的;

比特币系统中,一般是先对一个message取一个哈希,然后再对这个哈希值签名。