而SHA256函数的运算结果,是一个模为2的256次方的值,所以这个值一定是可以写成256位的。
把一个信息转换为一个特定数字,最早是为了验证两个文件是否一致。比如你在一些论坛下载软件的时候,经常会随着软件附带一个校验码,有时候是SHA256,有时候是MD5,它就是把整个软件的全部数据,经过算法生成这么一串字符,你下载好软件,在本地也可以使用校验工具把它算出一个结果,和论坛上的字符串做对比,如果一致,就代表这个软件没有被篡改过。
一行文字哪怕只是标点上有些微小变化,对应的SH256值也会产生很大变化。
你可以百度搜索一下SHA256,第一个结果就是在线SHA加密,输入一个句子,然后稍微改动一点点,看结果是不是有天壤之别。
这个函数非常重要,会贯穿我们讲述整个的过程中。
首先,它就是用来解决支付信息加密的问题。
比如我要付给开开200块钱,就在网络上写下一条信息:「老孙需要支付200元给开开」,这就是支付信息。但这条信息是有风险的,万一有人把200改成800,那我可就要哭了。
而刚刚的SHA256算法,就避免了信息被篡改的问题。这条支付信息的哈希值是确定的,(哈希值就是SHA256算出来的数值)。在发出信息的同时给出计算出来的哈希值,和刚才说在论坛上下载软件的例子一样,之后任何的改动都会被发现,只要被改动就视为无效。
但只保证了支付信息没有被改动过还不够。因为如果有人就是心理阴暗,发出很多条「老孙需要支付200元给开开」,然后录入支付系统,那我也要亏死了。
所以,光是加密信息还不行,还需要数字签名。它的作用是用来保证「老孙需要支付200元给开开」是老孙本人亲手发出的,而不是其他人发出的。
3 非对称钥匙:怎样确保信息源?我们现实生活里使用手写签名,是因为笔迹很难造假。但电子信息中,谁都可以敲出「老孙同意」这几个字,怎么用电子签名来确认一条支付信息是我本人确认的呢?
这就得靠「非对称钥匙」了。
任何信息都可以通过计算变成一段数字,比如我要给熊仔发一串数字「666」,我要加密这段数字之后发给熊仔,我俩可以事先约定一种加密,比如给每个数字都+3,熊仔那里收到的结果是999,按我们之前约定过的,每个数字都减去3,就得到了结果666。在这个过程中,数字「3」就叫做钥匙,又因为加密和解密都用的是它,所以叫「对称钥匙」。
在开放的互联网上,对称钥匙有着致命的缺点,因为钥匙至少需要单独传递一次,无论是打、还是发邮件,我得事先和熊仔约定钥匙是「3」。而传递钥匙这条信息本身是没有加密的。如果这个钥匙被人知道了,那谁都可以给熊仔发任何信息,熊仔也不知道哪条是我本人发的。
这时候「非对称钥匙」就要登场了。你可以这样理解它:加密和解密用的不是同一把钥匙,我选则其中一把加密的话,另一把钥匙就可以解密。
两把钥匙,我把其中的一把保留在自己手里谁也不告诉,叫做「私钥」,另一把钥匙则是公开给大家,谁都可以看见,叫做「公钥」。公钥和私钥是通过一种不可逆的数学计算关联成对的。是的,不可逆的运算还是基于刚才说的模运算。
数字签名的问题就是这么解决的。当我发出一条交易信息时,我先用自己的私钥给信息加密,再把加密后的内容连同公钥一起发布出去。别人如果用公钥解开了,就说明当初这条信息是用这把公钥对应的私钥加的密,那就是我本人了。
这两个知识点你理解了,我们就可以还原一次交易的过程了。
比如我要给开开发200,我的客户端软件会做这么几件事:
? 把「老孙给开开200」当作原始信息,对它做一次SHA-256运算,得到一个原始哈希值;
? 用私钥给原始哈希值加密,得到加密的哈希值
? 把原始信息、公钥、加密的哈希值,这三个内容同时发布到全网去,给别人验证。哈希值用来保证信息没有被篡改,加密和解密保证信息出自我本人。
到此为止,我们解决了信息源可靠且不可更改的难题,其实这两个问题现在任何一家银行都能解决,并不是的特权。可是别忘了,可是要「去中心化」呢!那如果没有了银行这个中心机构,会面临什么麻烦呢?
4 去中心:谁来帮我记录余额?没有中心机构,首先的问题就是每个人的账户余额由谁来记录。比如,老孙支付开开200元钱,可是老孙账户里的余额够吗?
这个疑问在传统银行系统里不是问题,因为银行可以查看任何人的账户余额。在银行的系统里,你是相信银行不会篡改你的账本的。
文章来源:《矿床地质》 网址: http://www.kcdzzz.cn/zonghexinwen/2022/1207/639.html