100%不一样,但也不一定;100%推不了,但也不一定•哈希函数

51 6~8 min

哈希函数与哈希值

要讲数字签名,首先要了解哈希值,哈希值,简单来说就是一个文件的身份证(又称消息摘要),不同文件哈希值的关系可以用这样一句话表述“100%不一样,但也不一定”。

例如,将任何一个文件转化为阿拉伯数字,代入H(x)=x mod n得到的就可以视为一种哈希值,这个表达式就可以看作一个哈希函数,因为它满足哈希函数的条件:

(1) 确定性• 对于相同的输入,哈希函数总是产生相同的输出。这使得哈希值可以作为数据的唯一标识。(🐢:签名基础,get!)

(2) 快速计算• 哈希函数的设计目标是能够快速计算哈希值,即使对于较大的输入数据。

(3) 雪崩效应• 输入数据的微小变化会导致输出哈希值的大部分发生变化。这使得哈希函数具有很高的抗篡改能力。

(4) 抗碰撞性• 理想的哈希函数应该很难找到两个不同的输入,使它们产生相同的哈希值(称为“碰撞”)。

不难看出,只要n足够大,这就是个完美的哈希函数。

当然,MD5、SHA-1、SHA-256等哈希函数都是基于复杂的加密算法设计,安全性比这个例子高了不是一点半点。

数字签名

现在,我们可以为之前🐢和🍄的交流加上数字签名了。来跟着一起算一算吧。(以n=100为例)

但在这之前,我们还需要一个步骤,再生成一对密钥给🐢。(公钥99,私钥989899)

参照上一篇文章,🐢藏好了私钥,并广播了公钥。现在我们有了明文114514和两对密钥。

首先,🐢首先要对这一明文计算哈希值,显然,等于14。

下面🐢使用🍄的公钥加密明文,得到“030626”,这是密文。

🐢又将哈希值使用自己的私钥进行加密,得到“858586”,这就是数字签名。加密到此结束。

解密则很简单,🍄收到后,先用自己的私钥解密密文,得到“114514”,计算哈希值“14”。现在,🍄要查询哈希表,找到🐢的公钥并解密电子签名,也等于“14” 。好耶,一次加密通讯成功了!(🐢:麻匪这下没招了吧。)

你会发现,无论哪处遭到篡改,都会被瞬间发现。

你可以在https://tools.turtlehome.top尝试现代密码学的加密算法,快去试试吧!

拓展•挖矿到底挖的是什么

必要的知识:

SHA-256,一种哈希函数,即将任何文件通过计算,都可以得到一个256位的二进制数的算法。

区块头:一个区块的标识,包含了:

  1. 用于确认协议的版本号。

  2. 上一个区块的哈希值(哈希指针)。

  3. Merkle根数:这个较为复杂,不过可以举个例子,假设现在有a-d四笔交易,分别计算哈希值,得到1-4四个数,两两拼接,再次计算哈希值,得到5和6,再拼接后计算哈希值,最后的结果就是Merkle根。

  4. 时间戳。

  5. 难度目标(马上会讲)。

  6. 随机数。

”比特币与区块链“这篇文章中,我们介绍了工作量证明,现在,终于可以解释算的那道题是什么了。

将一个区块的区块头进行二次SHA-256加密,就可以得到这个区块的哈希值,而挖矿的目标,就是让这个哈希值的前n位都是零。这听起来不难,只要改变随机数就好了,毕竟,每一位只有两种可能。可是,在现在的比特币网络中,这个n大约是76,算出结果的可能就是\frac{1}{2^{76} } ,用一块显卡要算上数千年。显然,根据哈希函数的原理,所有人只要一瞬间就能验证你算的正确与否,不得不说,这是一道好题。