每个人都有自己私密的信息,如何进行私密的沟通是人类一直以来的需求。古装片里面,动不动就会有你我入密室详谈这样的情节,密室保证的就是私密性。那我们这节内容,瞄准的就是如何在网络上进行私密的沟通,或者说的正式点,就是来聊加密通信问题。早期人们的解决方案其实跟密室是一个道理,就是通过私有网络,也就是从物理上隔绝其他人。但是私有网络衰落,互联网兴起后,客观条件就不同了,互联网是一个公开场合,数据在通信过程中默认是能够被别人获取到的,那么这个时候保证私密的策略就从“不让你看见”变成“看见你也看不懂”了。具体做法就是:首先把信息加密成密文,到达接收方之后,再把密文解密成信息了,这个过程就是加密通信。

对称加密和非对称加密

先说加密通信的一种最简单的方式,就是对称加密。这个是人类用了几千年的方式,凯撒密码就属于这种。所谓对称,意思就是发送方和接收方使用的是同一个钥匙,或者英文叫 key 。但是互联网上的加密通信,通常使用的却是另外一种形式,也就是非对称加密,或者叫公钥加密。

说说类似于凯撒密码的对称加密的基本工作原理。发送方会按照一定规则,把信息变成密文,密文说白了就是谁也看不懂的东西。等密文到了接收方手里,接收者需要按照同样的规则,也就是同一个 key ,把密文翻译成信息。加密通信过程就完成了。

但是对称加密的安全隐患就在于,如何传递 key 本身。没有 Key ,就不能建立安全的通信通道,没有安全的通信通道,就无法安全的把 key 传递给接收方,所以这就是一个鸡生蛋蛋生鸡的问题了。于是,互联网上做加密通信更为流行的一种方式是非对称加密。非对称加密,更准确的一种说法叫做公钥加密,特点是发送方和接收方使用的不是同一个 key 。这种方式略微有点反直觉了吧,具体原理稍候我们就是讲到。

总之呢,加密通信可以采用的方式有两种,一种是对称加密,一种是非对称或者叫公钥加密。对称加密的特点是发送方和接收方采用相同的 key ,非对称加密发送方和接收方采用的是不同的 key 。

公钥加密基本原理

下面来详细说说用公钥加密的基本原理。主要是要理解公钥和私钥的关系。

首先,可以在自己的机器上安装类似 ssh-keygen 这样的软件来生成公钥和私钥。注意,每次生成的时候,就会同时生成一对,一个是公钥,也就是 Public Key ,另外一个是私钥,也就是 Private Key 。公钥是可以公开的,分享给任何人的都没问题,私钥一定要保密。公钥和私钥之所以是一对,是基于二者是有天然的数学上的联系的。注意这种联系有单向性,那就是由私钥可以很简单的得到公钥,而用公钥去反推私钥就不可能了。当然,密码学领域不存在完全不能破解的密码,但是如果一个密码需要很久很久,例如一万年才能破解,就认为这个密码是安全的了。同时多扯一句,单向联系一般就是通过一些无解的数学问题来确定的,这类问题只能正向运算,不能反向运算。比如 8616460799 这个数是两个数相乘得到的,但是要从结果反推出这两个数,是基本不可能的。实际中 RSA 和椭圆曲线算法,都是这一类的数学问题。

好,有了公钥和私钥这一对儿有天然联系的秘钥。那么加密通信过程是怎么样的呢?首先,如果 Alice 想让 Bob 给她发信息,注意这里 Bob 是发送方,而 Alice 是接收方。首先 Alice 要把自己的公钥传递给 Bob ,然后 Bob 用 Alice 的公钥去加密信息,Alice 收到密文之后可以同自己的私钥进行解密。这就是非对称加密的基本逻辑了,公钥用于加密,私钥用于解密。这个过程好比就是 Alice 想安全的从 Bob 那里获得一些机密信息,所以 Alice 首先给 Bob 邮寄过去了一个带锁的箱子,注意这个锁就相当于公钥,是用来加密的。Bob 信息放到箱子里锁好,然后邮寄给 Alice ,这样 Alice 就可以用这把锁的钥匙,也就是这个公钥对应的私钥,去开启箱子了。另外一个比喻也很有道理,就是 Bob 如果想给 Alice 发信,那么首先要知道 Alice 家的地址,邮递员把信放到 Alice 家的邮箱中,Alice 就可以用钥匙打开邮箱拿到信了。这个过程中国,Alice 的公钥就相当于 Alice 家的地址,而私钥就是自家邮箱的钥匙。

当然,上面所说的过程还只是单向通信,要实现双向通信,就需要双方把各自的公钥传递给对方了。

公钥加密的更多技术细节

公钥加密,或者说非对称加密的基本思路是比较简单的,就是用公钥去加密,用私钥去解密。不过,最后我们再稍微深入一点,聊聊公钥解密相关的一些技术细节。

首页一个有意思的问题,如果公钥就是用来加密信息的,那为啥不叫 lock 也就是锁,而要叫 key ,钥匙呢?所以说既然公钥也是钥匙,那么它就是一定也有解密功能。公钥加密技术其实有两个重大应用,一个就是我们本文所述的加密通信,但是还有第二个就是数字签名。加密通信是用来保证机密性的,而数字签名是用来认证的。数字签名不是咱们本文的重点,但是它的基本原理是用私钥去加密,而用公钥去解密。也就是我用私钥签名一份文件,而全世界的人都可以用我的公钥去解密我的数字签名,如果解密成功,就可以认定,这个文件的确是我签署的。所有私钥可以叫做“解密 key”,公钥可以叫做“验证 key”。这样,我们就理解了为啥公钥也是 key 了。

另外一个问题是,公钥加密技术都有哪些实际应用呢?首先一个就是加密通信,银行政府传递数据也是用这个思路的,所以加密通信还真是关系重大。如果你是程序员,可能会经常用 ssh 登录服务器,这个背后也是用公钥加密技术来实现安全通信的。另外网站现在都流行使用 HTTPS 协议,也就是安全的 HTTP ,来达成浏览器跟服务器之间的加密通信,这个背后也是公钥加密技术。服务器把自己的公钥发送给浏览器,这样我们如果在浏览器里面输入银行密码等机密信息,就是先用公钥加密后再发送了,所以也就安全了。另外,比特币等加密货币,背后也都是公钥加密技术,最常见的应用场景是使用私钥来签名交易。

最后一个问题会引发我们进一步的学习,那就是如何解决公钥加密过程中的一些具体问题,例如,如何安全的把公钥发送给对方,保证公钥没有被篡改过。实际上这个问题还真的是非常困难的,所以会涉及到 CA ,也就是证书机构,以及 PKI 也就是公钥技术设施这些概念。比如,我打开的一个网站采用的是 HTTPS ,但是如何确定这个网站的公钥就是安全的呢?目前来讲没有其他的好方法,只能依赖与一个可信第三方,也就是 CA 来颁发证书,证书中包含公钥。CA 是 PKI 的核心组成部分,但是 PKI 还提供了更多的功能。

公钥加密的更多的技术细节,咱们还是需要去进行更为深入的学习才行。这里就不展开了。

总结

总结一下本节的内容吧。今天聊的是加密通信。对称加密是比较传统的好理解的方案,但是其实非对称加密才是最常见的做法。所谓非对称,就是加密和解密是采用不同的 key 。公钥用来加密信息,私钥用来解密信息。双方通信之前,要先互相交换公钥,这样才能建立起安全的双向通道。公钥加密的最大应用有两个,一个就是本节聊的加密通信,另一个就是数字签名。关于数字签名的内容后续小节中继续来聊。