加密是一个很难理解的东西,这里头满是数学证明。不过,除非你是在开发一个加密系统,否则无需了解那些高阶的复杂知识。
如果你看这篇文章是为了创造下一个 HTTPS 协议,很抱歉,请出门左走,鸽子是远远不够的。不然的话,先去煮一壶咖啡,再来看文章吧~
爱丽丝、鲍勃以及鸽子?你在网络上进行的任何活动(阅读这篇文章、在京东上购物、分享猫咪的照片),都是通过服务器发送和接收信息。
这可能有点抽象。那就让我们设想这些信息都是通过信鸽传播的。看起来可能有点奇怪,不过请相信我,HTTPS 的工作原理和信鸽是一样的,只是要快得多。
同样,我们用爱丽丝、鲍勃以及马洛里来代称服务器、客户机以及黑客。如果之前你尝试过理解加密系统的原理,那这些名字你不会感到陌生,因为他们在技术文献中经常出现。
第一次简单的通信如果爱丽丝想要和鲍勃通信,她会将信件绑在信鸽的腿上,然后信鸽带着爱丽丝的信飞到鲍勃那里去。鲍勃收到信后,知道了爱丽丝对她的爱意。到目前为止,一切看起来都还不错。
但要是马洛里在途中拦截下正在飞行的鸽子,然后将信件内容篡改了呢?鲍勃不会知道爱丽丝写来的这封信在途中是被篡改过的。
这就是 HTTP 的工作方式。很恐怖吧?所以,我不会通过 HTTP 发送我的银行卡信息,你也不应该这样做。
加密假设爱丽丝和鲍勃非常的狡猾,他们约定好以一种密文的形式写信。他们将每个字母在字母表上移动三个位置,例如:D —> A,E —> B,F —> C。而诸如 “secret message” 这样的句子,就会变成 “pbzobq jbppxdb”。
如果马洛里再次拦截下鸽子,并试图篡改信件内容。他会无从下手,因为她不知道密文的规则,即便改了也会毫无意义,令人不知所云。但是鲍勃会根据密文的规则轻松的解读出信件的内容,也就是 A —> D,B —> E,C — > F。加密的句子 “pbzobq jbppxdb” 会被解密成 “secret message”。
酷毙了!
这就是对称加密(symmetric key cryptography),因为你知道了如何加密也就知道了如何解密。
上面举例的加密方法就是非常有名的凯撒密码(Caesar cipher)。在现实生活中,我们使用的是更加酷更加复杂的加密方法,但主要的原理都是一样的。
如何确定加密规则?除了发送者和接受者,没有其他人知道加密规则,在这种情况下,对称加密是非常安全的。在凯撒密码中,加密的关键在于每个字母移动的偏移量。在我们的例子里,偏移量设定为3,但也可以是4或者12。
问题在于,如果爱丽丝和鲍勃在用鸽子通信之前从未谋面,他们就没有安全的办法来制定加密规则。如果他们把加密规则写在信里通过鸽子传递,马洛里就可以拦截鸽子从而窃取加密规则。之后,每次爱丽丝和鲍勃通的信,马洛里都可以拦截下并且通过他们的加密规则去破解和修改。
这就是典型的中间人攻击,避免它的唯一办法就是同时更改加密系统。
携带盒子的信鸽因此,爱丽丝和鲍勃制定了一个更加安全的加密系统。当鲍勃要发送信息给爱丽丝时,他会进行如下步骤:
鲍勃给爱丽丝寄去一只鸽子,鸽子没有携带任何信件。
爱丽丝在鸽子腿上绑了一个带锁但是没有上锁的盒子,钥匙保存在自己手里,然后将鸽子寄回给鲍勃。
鲍勃把信件放在盒子里,上锁。鸽子又飞回到爱丽丝那里。
爱丽丝收到鸽子后,用手中的钥匙打开盒子,然后表情愉悦的看鲍勃写给她的情书。
这样一来,马洛里因为没有盒子的钥匙,即便拦截下鸽子也无法修改信件内容。当爱丽丝要给鲍勃写信时,遵循的也是以上这些步骤。
爱丽丝和鲍勃使用的这种新的加密方式通常叫做非对称加密(asymmetric key cryptograpy)。为啥叫做非对称呢?因为即便你知道如何加密(给盒子上锁),你也没有办法解密(打开盒子的锁)。在技术上,这个盒子就是公钥(public key),而打开盒子的钥匙叫做私钥(private key)。
为啥要相信这个盒子?如果你看的很认真,那么可能会注意到一个问题。当鲍勃收到没有上锁的盒子,他怎么确定这个盒子没有被马洛里调包呢?
爱丽丝决定给盒子签名,当鲍勃收到盒子后检查上面的签名就可以知道盒子是不是爱丽丝发过来的那个。
有些人可能会想,鲍勃如何第一时间识别出爱丽丝的签名呢?好问题!爱丽丝和鲍勃也想到了这个麻烦,所以他们决定,让特德在盒子上签名,爱丽丝不用签了。