今天我想写一篇文章,介绍一下加密传输数据的两种模型,单锁模型和双锁模型。虽然我刚才说过是“介绍”,但是实际上我也是刚刚接触这些词不久,而且并不深入,所以很可能会说错不少地方。但是我觉得这个东西相当有趣,所以尽管接触不深,但是我还是愿意分享我的想法。
单锁模型
所谓“单锁模型”,就是在传送的过程中使用一把锁,我们把要传送的消息想像成一个箱子。现在双方配了一样的钥匙,锁是外加的锁,不是内嵌在箱子中的,那么A传东西给B,每次就把这把锁加上,而C负责跑腿,到了B后他可以解开锁看箱子的东西。在这个过程中锁是一直加在箱子中的,所以跑腿C没办法偷窥箱子里的东西。我们认为,加了锁就是安全的。
双锁模型
双锁模型比单锁复杂,传送的过程中使用两把锁。A有自己的钥匙和锁,B有自己的钥匙和锁,A传东西也是先放进箱子再传,A锁上锁,B收到后因为没有A的钥匙所以解不开。然后B也加上自己的锁上去,再给回A,A解自己的锁,这时箱子因为还有B的锁锁着,所以A不能解开,再传给B,B再解开自己的锁。这样总共三次来回完成传送过程。整个三次握手的过程中,因为箱子始终有锁(至少锁着一把),所以跑腿C始终没法偷看里面的东西,达到箱子安全的目的。
这时,应该有人会想,既然单锁那么方便,就用单锁好了,干嘛还要把东西搞复杂。其实我当初也是这么想的,但是仔细思考之后,发现双锁原来可以大有作为。
首先,我们可以想一个问题,假如A有很多好友,都要加密传送。如果现在采用单锁模型,假设A希望更安全,那么他可以为不同的好友采用不同的锁,也就是一个好友一把锁,那样子最安全。但是他个人就要保存很多钥匙,甚至传给好友时,还要先检查到底要用哪条钥匙。但是双锁模型不存在这个问题,因为根本不需要对方的锁的钥匙,所以每个人只需要保存自己的钥匙就可以和不同的人通信。
其次还有一个问题,根据上面所说的,单锁模型要求传送开始之前,双方都有那条钥匙。所以假如跟一个陌生人通信,要么在通信前找个见面的机会把钥匙给他,要么用别的方法把钥匙送到他手上。这很麻烦,而且不安全。而且这样如果我将来要换一把锁,那么刚才的步骤还要重做一遍,也就是说,很麻烦,但是不安全。双锁的话自己随时都可以换自己的锁,别人也不需要知道,彻底解决了这一问题。
虽然双锁模型有上面说的好处,但可惜有一个致命弱点,通信量和时延太大。这是因为“三次握手”。如果每条信息都来回三次,那么占用的带宽和传输的时延也是普通传送的三倍。
在我的想法里,暂时想到一种结合的方法(当然还有很多可以挖掘)。一开始首先利用双锁传送单锁,确认后再利用单锁通信。这样的话可以用随机办法生成单锁和双锁,单锁可以周期性再产生,利用双锁机制把单锁加密传送过去,真正的通信内容用单锁加密。
当然,这里的双锁和公钥密钥系统是不同的,但是公钥密钥据说也是从这个模型衍生,以后我懂得多一点的时候我再说说公钥密钥系统吧。