想象一下这个场景:
某天晚上,你寂寞难耐,向互联网上的一个素未谋面的好友(虽然你们在网上很熟悉,但是在线下从来没有联系过,也没有他线下的联系方式)发送一个请求,让他把在网盘上保存的最新的岛国片通过网上发给你,由于考虑到安全与隐私,你可能担心下面两个问题:
- 在传输过程中,这个片子里面的内容会不会被XX机关给截取了,然后知道你们发送的内容后,你的一世英名就可能就被毁了。
- 在传输过程中你怎么知道不会被其它人给调包了呢,给你一个恶作剧呢?
你可能想到一个很常见的解决方案。
让好友加密分享,在分享的时候把密码告诉你,比如888888。你收到到密码后打开分享网址,输入密码,就能看到好友分享的文件。其它用户也能看到好友发的这份文件,但是他们不能解密这个文件,只有输入正确的密码,即888888文件才能被打开。反过来说,只要用户知道了这串数字888888就能正确解密这份文件的内容。
而888888专业语就叫:密钥。
看到这,你是不是想跳起来说这么简单的一问题,需要这么绕圈子来说么?别急,再往下看。
好友如何把888888正确的告诉你呢,告诉你这条消息的同时会不会也涉及到上面的两个问题?
在互联网上,有一个很重要的特点就是大家只能在网上进行通讯,在上面的这个例子中你的好友只有你线上的联系方式,那么怎么保证他给你说密码的时候没有被其它人知道呢,想要解决这个问题是不是也要提前在网上给你说一下规则或者算法来保护这个密码888888呢。但是你又能确保这个沟通是正常的呢,没有被其它人知道吗?那是不是还要提前进行沟通,那你与好友提前沟通的时候是不是还要进行一个约束,这样就进入一个死循环了。
看到没有,想要安全地(即使别人知道的情况下也不知道具体内容)看个片子得多难啊?苍天啊,大地啊,难道就没有其它办法了吗?
为了解决这个问题,我们先看一下目前互联网上最基本的加密是如何做的,就以我们每天都要用的登录操作为例:
比如用户设置的密码为:111111,但是在平台里面保存的不是这个密码,而是通过算法加密后的一串数字,比如经过Md5算法后存的就是:96e79218965eb72c92a549dd5a330112。
你在登录的时候输入用户名,密码111111,这个时候服务器那边就会把你输入的111111进行加密,然后与自己的数据进行对比,如果正确则登录成功,如果错误,则登录失败。
在这个例子中最重要一点就是其它人如果知道96e79218965eb72c92a549dd5a330112 这串数据,也不能根据这串数据去推测你真正的密码,这样就保证了你的密码安全。
这是因为这个算法有一个问题就是加密算法不可逆,即使你知道了加密后的数据,也知道MD5算法,但是你也不能推测出真实的数据(只有暴力破解,但是这个工作量相当大,当你的密码足够复杂的情况下,基本上无解)。即:
密码加密这个是通讯加密最常见的一个应用,但是这个不适应于普通的信息传输,更多的是用来验证结果的准确性。在上面的需求中,我们需要的是别人拿到数据,也知道算法也枉然,一方面是要求别人不能解密,但是自己又要能解密。
有没有这个可能呢?
我们回忆一个小学的时候看到过的一个数字魔术,你让你身边的人想一个任意的3位数字,然后乘以91,只要他把乘以91后结果的后三位数告诉你,你就由此可以推算出他心里想的数字。
比如他想的是321,那么他告诉你乘以91后结果的后三位数据是211(321 X 91 = 29 211),你就能推测他想的是321,你通过把这个数据再乘以11后的结果的后三位就是答案,211 X 11 = 2321,这个数据的后三位就是用户想的数据。
你自己可以自己多试一下其它的数据。记住原则:三位数,91,11,后三位,这个几个关键字。
为什么会这样呢?其中有两个数字很关键,91与11,91是你公布出去的,而11只有你知道。为什么通过这两个数字你能知道用户想的数据?
因为91*11 = 1001,1001乘以任意三位数,结果的后三位数就是用户想的数据。
在这个过程中,其中91就是密钥A,11就是密钥B,我们称91是公钥(公布出去的密钥),11为私钥(只有自己私下知道),公钥是我可以公布出去的,私钥只有我知道的,只要他按照我规定的算法加密数字(相乘),我就可以通过私钥来进行解密。
可能大家觉得91与11太简单了,不具备说服力,但是如果这个数字有300个位长呢,大家可能没有概念,在2016年超级计算机分解一个300多位数,让它找出这个数据对应的两个质数相乘等于它,这个过程花费了一年。
从概率,从理论上解决了这个问题。
这个就解决了刚才死循环的问题,我们不再对密钥进行保护。所有人都可以知道公钥,我们只需要保护自己的私钥就可以了。
大家想明白过后再来看下在前面我们提到的两个问题如何解决。
1. 在传输过程中,这个片子里面的内容会不会被XX机关给截取了?
我们解决方案不是不让有关部门知道我们在发送文件,而是让他们即使知道了我们在发送文件,也得到了文件,却也无可奈何,因为没有私钥就不能解密。操作也很简单,你把你自己的公钥公布出去,好友拿到公钥后,对要发送的文件进行加密,然后把加密了的文件再发送过来。
2. 在传输过程中你怎么知道不会被其它人给调包了呢,给你一个恶作剧呢?
这个问题我们可以让好友在发送文件的时候再用好友自己的私钥进行一次加密,加密只能用好友提供的公钥进行解密。即发送消息的时候先用你提供的公钥进行加密。加密后再用好友自己的私钥进行加密。而你收到消息后先用好友的公钥进行解密,然后再用自己的私钥进行二次解密,这样就保证了其它人在传输过程中不可以篡改内容,也就让你确认消息就是好友发送的。
以上就是我们钱包算法的原理。对应钱包,91就是我们的对外地址,大家都把比特币交易到91上去,我们只要记得11就可以得到这个地址里面的所有的数据,也就拥有了这里面所有的数据。并且在这个算法中,通过私钥是可以推算出你的公钥的,所以理论上只需要保存私钥就可以了,私钥是一串数据,这串数据可以存在你的电脑里面了, 也可以存在你的一张纸里面。
可以说钱包对用户来说是一个很重要的工具,但是除了这些,钱包还有下面其它的几个特性:
- 钱包里面存着用户的密钥对(公钥与私钥)
- 钱包解决了比特币中的中心化信任、所有权问题
- 钱包是独立于运行的,与比特币的底层协议区块链是没有关系的
这里面就不过多介绍钱包里面的内容了,主要是分享一下自己这段时间学习公钥,私钥的一个理解,欢迎大家拍砖。
网友评论