密钥交换 怎么工作
两个人要用同一把锁,就得有同一把钥匙。可这把钥匙怎么交过去?邮寄吧,中途可能被人复制;见面交吧,又离得太远。令人惊讶的是,有一种办法,钥匙一次都不用寄,两个人就能拿到同一把钥匙:两人一起把它做出来。
快钥匙得安全地分享
上一课的公钥加密很安全,但计算量大、速度慢。长内容全都用它来收发,太费时间。所以真正的内容会用对称加密快速锁上。
问题在于,用对称加密,两个人必须拿着一模一样的钥匙。对称加密那一课卡住我们的密钥分发问题,在这里又冒了出来。用公钥锁住对称密钥再寄过去是一种办法,不过这一次,我们来看另一条路:根本不寄钥匙。
点“公钥”和“对称密钥”比一比。公钥安全但慢,对称密钥快,却得两边共享同一把钥匙。
想用快速的对称加密,这个心思很明确。可直接把钥匙寄过去很危险:中途一旦被人复制,锁再结实也没用。
所以需要一种办法,钥匙本身不上路,两个人也能拿到同一把钥匙。我们拿调颜料来打个比方,把这个办法画出来。
往公开色里掺私密色
把两个人叫做嘉蓝和娜来。先一起定一个公开色,这个颜色谁看到都没关系。接着各自挑一个绝不给别人看的私密色。
嘉蓝把公开色和自己的私密色调成一个新颜色,娜来也把公开色和自己的私密色调成一个新颜色。然后,两人只把调好的颜色寄给对方。关键在于:颜料一旦调在一起,就很难再分辨出里面掺了哪些颜色。
点一下,让嘉蓝和娜来各自把私密色掺进公开色。只有两个调好的颜色互相寄出,私密色仍留在手里。
现在,嘉蓝手里是娜来寄来的调好的颜色,娜来手里是嘉蓝寄来的。两人也都知道公开色。眼下他们手里的颜色还不一样,但只要再走一步,就会变成一样。
各自往收到的颜色里再掺一次自己的私密色,两人就会得到一模一样的颜色。为什么会这样,亲手试试就知道了。
两人得到同一个最终色
嘉蓝手里的颜色里已经有娜来的私密色,嘉蓝再往里掺自己的私密色,就成了公开色加上两人私密色的颜色。娜来也一样,往掺有嘉蓝私密色的颜色里再掺自己的私密色。
掺的顺序不同,但放进去的颜色相同,结果也就相同。所以两人得到一模一样的最终色。这个最终色就是只有他俩知道的共享秘密,拿来当作对称密钥用。
两格里的最终色一模一样了。钥匙一次也没上路,来回传的只有公开色和调好的颜色。即便如此,两人还是拿到了同一把钥匙。
不是把同一个秘密寄过去,而是一起把它做出来,这就是密钥交换的核心。它以最早提出这个方法的两个人命名,叫迪菲-赫尔曼密钥交换;实际使用时,用的不是颜料,而是大数的运算。那么,要是有人把来回传的颜色全都偷看了,会怎样?
偷看了也造不出最终色
假设有人在路上盯着所有来回传的颜色。这个人知道公开色,嘉蓝寄出的调好的颜色、娜来寄出的调好的颜色,他也都看到了。即便如此,他还是造不出最终色。
要造出最终色,得有某个人的私密色,可私密色一次也没上过路。从调好的颜色里单独把私密色分离出来,也非常困难,就像一杯调好的绿色颜料,很难再把里面的黄和蓝分得清清楚楚。所以偷看的人到不了同一个最终色。
把偷看的人在路上看到的东西一个个点出来。公开色和调好的颜色全都看得到,但没有私密色,就造不出最终色。
偷看的人手里留下了一个空格,因为少了私密色这最后一块。所以嘉蓝和娜来可以放心地把这个最终色当作两人专属的对称密钥。
不过有一点要小心:它能防住只偷看的人,却防不住在中间装成嘉蓝去跟娜来调色、又装成娜来去跟嘉蓝调色的人。所以密钥交换要和确认对方身份的签名、证书一起用。还有,密钥交换和用公钥锁住内容并不是一回事。
小结
归纳起来是这样:公钥加密安全但慢,所以真正的内容用快速的对称密钥来收发。这把对称密钥不是寄过去的,而是一起做出来的。各自往公开色里掺私密色再交换,然后往收到的颜色里再掺一次自己的私密色,两人就得到同一个最终色,也就是共享秘密。
偷看的人没有私密色,造不出这个颜色。密钥交换是一起做出同一个秘密的步骤,和用公钥锁住内容的公钥加密不同。
点一下这两个概念,把它们分开。密钥交换是一起做出共享秘密,公钥加密是用公钥锁住内容。
现在你知道了,相隔很远的两个人,不用让钥匙在路上露面,也能一起拥有同一个秘密。这个简单的调色原理,如今每次安全地连接网站时都在用。浏览器和服务器每次连接,都会用这个办法做出一把只给这次连接用的新对称密钥,连接结束就扔掉。所以就算日后服务器的私钥泄露,过去的对话也解不开,这个性质叫前向保密。就像每次见面都临时配一把新锁,用完就丢,旧锁的钥匙就算被人捡到,也打不开如今的门。
剩下的作业,是把半路插进来的冒牌货筛出去。下一课讲数字签名:用私钥留下的记号,确认消息真的是那个人发的。