继续聊聊
上一期讲到,我们需要改良我们的系统,在不泄露密码的前提下,证明一个消息是谁发送的?
我们先温习一下我们的协议,当然,最好是再次阅读一遍上一篇文章。
如何证明这条消息的发送人是A呢?
这里就需要我们祭出区块链里的第一大秘密武器,非对称加密。
介绍非对称加密之前,我们需要先了解对称加密
什么是对称加密呢?我先举个例子,假如你想给一个消息加密,比如加密 “20180330” ,有什么加密方法呢?
一个简单的办法就是,按照给每位数字加1,也就是3代表 2 ,用 1 代表 0 ,用0 代表 9。这样,20180330 加密后 就是 31291441 , 这样别人就看不懂了,达到了加密的效果。
那如何解密呢? 解密就是加密方法的逆运算,每位数字减1,就变回20180330了。
这种解密过程是加密过程的逆运算就叫做对称加密。
对称加密中,只要保留同一个密钥 F(x),即可完成加密和解密过程,这种加密方式有一个问题,一旦密钥 F(x) 泄露,整个通信过程就被破解了。
那么什么是非对称加密呢?
非对称加密通常满足以下两个条件
解密函数和加密函数不是互为逆运算
解密函数与加密函数均不存在反函数
也许你会问,真的有这样神奇的办法么?
让我们来亲自举个例子,来体会以下非对称加密的神奇。
假如我们还是要给消息 “20180330” 加密
加密 : 20180330 * 113 = 2280377290
这个2280377290 就是我们要发送的密文。
仔细看看,如果我们只看末尾的8位数,正好是20180330,也就是说再取一个模运算就成功解密出明文,20180330 ,拿起计算器好好算一遍,看看,就是这么神奇。
这里面呢,加密函数也可以叫做公钥,解密函数可以叫做私钥。
不过这个例子还不够好,因为这里面的加密函数和解密函数均可以有逆运算,只要盗取密钥F(x) 依然可以破解信息。
我们升级下一个例子:
首先看这两个函数,可以明确,这两个函数没有反函数。因为涉及到模运算,势必存在多个x值对应同一个y值,如果存在反函数,反函数势必就会存在一个x值对应多个y值,与函数的定义相悖,就证明了不存在反函数,即无法通过F(x)的逆运算来破解出明文。也就是即使公钥被盗也无法破解消息。
我们试试看结果:
计算的数比较大,我们加密一个简单一点的消息,比如 消息 “65”
数字较大,我们用 python 的解释器来计算
加密过程;
也就是说,消息 65 加密后是 2790 ,以密文2790 来传输
看,就算告诉你公钥,依然无法破解出明文 65
解密过程:
完美解密出明文 65 。
这就是非对称加密,神不神奇?
非对称加密系统中,包含一对钥匙,分别是公钥和私钥。
信息的传递过程如下图 :
在这个过程中,只要Alice 保存好自己的私钥,就没有人能够解开密文。而且,即使暴露出公钥,人们也无法通过公钥的逆运算解开密文,这就是非对称加密中最神奇的地方。
为什么这套加密算法无法被破解,是因为自然界存在几个天然的数学难题,比如大数的质因子分解,离散对数问题,椭圆曲线算法等。这些数学难题保证了这个加密算法的安全性。
为这里的安全性打一个直观的比方,就是即使你动用全地球的超级计算机从宇宙大爆炸开始就尝试破解计算,算到今天也只能以出门就看见外星人的概率蒙对一次……
回到我们的问题,有了非对称加密,如何用在我们的之前构建的点对点转账系统中呢?
我们之前的问题是,如何在证明一条消息是A发出的,这个问题光有非对称加密还不行,还需要另一个大招
不可逆加密——哈希运算
(未完待续……)
感谢各位小伙伴的催更,让我有了继续填坑的勇气……
欢迎评论区留言~
领取专属 10元无门槛券
私享最新 技术干货