互联网就是个公开演讲的广场。意思是任何人说任何话,其实别人都是能听见的。这个认为是互联网的天性了,那么在这个前提下如果我和我一个朋友说点机密的事情,同时不想让别人偷听到,这个就成了一个有点挑战性的技术问题,也就是今天我们要讨论的加密通信。
对称加密
几千年来,我们人类都在用一种“对称性加密“的形式来进行秘密信息的传递,”对称“指的是加密用一个密码,那解密是用的还是这个密码。但是“对称性加密”为啥不能用在互联网上的加密通信中呢?说说这个过程,我有一个文件,用一定的加密方式来进行加密(比如用一些文件压缩程序),然后可以把加密后的这个包,传递给我的朋友,到目前为止一切都好。但是接下来的问题是,我朋友如何才能解密我给他的文件呢,显然我必须安全的把我加密时输入的密码安全的传递给他,这样才能完成这个加密通信过程。所以这就有了一个鸡和蛋的问题。最终我可能就不得不借助互联网以外的工具,例如打电话,来把密码给我朋友了。所以,对称性加密是不适合用于互联网上的加密通信的。
非对称加密的原理
那我们就可以想一下,是不是有一种“非对称加密”的方法能解决鸡和蛋的问题呢?恭喜你,答对了!非对称加密用一句话来描述就是,加密是用一个密码 key,而解密则会用另外一个密码 key。安装好相应地程序之后,任何人都可以在自己的计算机上来生产这一对密码。其中用于加密的这个叫公钥,是可以公开给别人的,所以叫”密码“这个不严密,还是英文好,就叫 key。另外一个是绝对自己要保密好的,叫”私钥“,这个是用来解密的,真的是”密码“。
这两个 key 是一对,意思是他们在数学角度是有着联系的,但是如果想要从公钥计算出私钥也是不可能的。加密通信的过程是这样的,收信人,比如说我,先生成这一对 key,然后我想跟我的朋友秘密通话,那我就把我的公钥传给他,这个反正有人得到也没关系。我朋友拿到公钥之后,就把他想要跟我说的话进行加密,然后把加密后的信息通过互联网传给我,整个互联网上,即使有其他人得到了这些加密数据也没用,因为只有我拥有跟那个公钥配对的这个私钥,所以也就只有我,才可以解密这个信息。
非对称加密的类比和应用
我们再来打个比方。我家门口有个信箱,那么凡是知道我家地址的人就可以给我发信了,所以我家的地址就相当于公钥,但是由于只有我自己有信箱的钥匙,所以也只有我能看到信。那这个信箱的钥匙当然就相当于私钥了。
打另一个比方。我和朋友要秘密的通信。首先朋友寄给我一把她的打开的锁,这样我把信放到一个盒子里,锁上,给她寄过去。拿到盒子之后,朋友拿出自己的钥匙就可以打开箱子了。反过来,如果我想从她那里得到回信,那我就给她寄我的锁就行了。这种通信方式的好处是,任何一把锁的钥匙都没有邮寄过。
最后说实际的一个应用。我在北京,如果我有一台服务器在美国,那么我如何让信息从我的服务器上安全的传递到我这里呢?首先,我先生成一对 key,然后我就把公钥传到我的服务器上。这样,我的服务器就可以把信息加密,然后传递给我了,听起来可能比较麻烦,但是实际中有 ssh 这样的程序帮忙,其实加密和解密过程都是自动完成的。 下面是生产秘钥的具体操作过程:
$> ssh-keygen
Generating public/private rsa key pair.
$> ls .ssh/
id_rsa id_rsa.pub
好,加密通信就说这么多,更多信息大家可以参考 http://en.wikipedia.org/wiki/Public-key_cryptography ,以后有机会我们会谈一个相关的话题:数字签名。