本集重点
- 多层防御
- 加密&解密
- 凯撒加密
- 替换加密
- 移位加密&列移位加密
- 德国Enigma加密机
- 1977年“数据加密标准”
- 2001年“高级加密标准”
- 密钥交换
- 用颜色来举例“单向函数”和“密钥加密”的原理
- 迪菲——赫尔曼密钥交换
- 非对称加密
- 非对称加密算法
多层防御
在过去两集,我们聊了很多计算机安全话题。但事实是,世上不存在100%安全的系统。总会有漏洞存在,而且安全专家知道这一点。所以系统架构师会部署多层防御*(defense in depth),用多层不同的安全机制来阻碍攻击者,就像城堡的设计一样:(入侵者)首先要避开弓箭手、穿过护城河、翻过城墙、避开热油、打败守卫…不过我们这里要说的是,计算机安全中最常见的防御形式:密码学(cryptography)。
加密&解密
密码学一词来自cryto和graphy,大致翻译成“密码写作”。为了加密信息,要用加密算法(cypher)把明文转为密文。将明文转为密文叫加密(encryption),把密文恢复回明文叫解密(decryption)。
凯撒加密
加密算法早在计算机出现前就有了。朱利叶斯·凯撒就使用凯撒加密(Caesae cipher)的方法来加密私人信件。他会把信件中的字母向后移动三个位置(比如A变成D)。为了解密,接收者要知道:1.用了什么算法;2.要偏移的字母位数。
替换加密
有一大类算法叫“替换加密”(substitution cipher),凯撒密码是其中一种。该算法按照某种机制把每个字母替换成其他字母。但是有个巨大的缺点,每个字母的出现频率是一样的。比如E是英语中出现频率最高的字母,如果把E加密X,那么密文中X的出现频率会很高。熟练的密码破译师(cryptanalyst)可以从统计数据中发现规律,进而破译密码。
移位加密&列移位加密
另一类加密算法叫做“移位加密”(transposition cipher)。我们可以看下面这个例子:
我们来看一个简单例子叫“列移位加密”(columnar transposition cipher),我们把明文填入55的网格。
为了加密信息,我们换个顺序来读。比如从左边开始,从下往上,一次一列。加密后字母的排列不同了。
解密的关键是,收信人需要知道读取方向和网格大小是55。
德国Enigma加密机
到了1900年代,人们用密码学做了加密机器。其中最有名的是德国的英格玛(Enigma),纳粹在战时用英格玛加密通讯信息。Enigma是一台像打字机的机器,有键盘和灯板,两者都有完整的字母表。而且它有一系列“转子”(rotros),是加密的关键。
首先我们只看一个转子,它一面有26个接触点,代表26个字母,然后线会连到另一面来替换字母。这个过程就是替换加密。
但是英格玛更加复杂一些,因为它有3个或更多转子,一个转子的输出作为下一个转子的输入。转子是一个叫反射器的电路,它会将转子的每个引脚连接到另一个引脚,并把信号发回给转子。最后机器前方有一个插板,可以把输入键盘的字母预先进行替换。假如我们输入h,电信号会通过转子、到达反射器、然后回到转子和插板,并照亮键盘灯板上的字母“L”。
而如果我们按下l,键盘板上的h就会亮起来。换句话说,加密和解密的步骤是一样的。只要我们能确保发送机和接收机的初始配置是一样的就行。而英格玛将字母加密后变成另一个字母将会成为其弱点之一。这也是日后图灵破译英格玛机的关键之处。
为了不让英格玛只是简单的字母替换,每输入一个字母,转子就会转一个,类似于汽车里程表。如果输入"A-A-A",输出可能会变成"B-D-K"。映射会随着每次按键而改变。
1977年“数据加密标准”
随着计算机出现,加密从硬件转往软件。早期加密算法中,应用最广泛的是IBM和NSA于1977年开发的数据开发标准(data encryption standard,DES)。DES最初使用的是56bit长度的二进制密钥,因此有 2 56 2^{56} 256个不同的密钥。1977年时只有NSA有这个能力破解这种密钥,但是到1999年一台25万美元的计算机能在两天内把DES的所有可能密钥都试一遍,因此DES算法不再安全。
2001年“高级加密标准”
因此2001年推出了:高级加密标准(Advanced Encryption Standard,AES)。AES使用更长的密钥——128位/192位/256位——让暴力破解更加困难。128位的密钥,哪怕用现在地球上的所有计算机,也要上万亿年才能试遍所有组合。AES将数据切成一块一块,每块16字节,然后用密钥进行一系列替换加密和移位加密。然后加上一些其他操作进一步加密信息。每一块数据会重复这个过程10次或以上。采取10次以及使用128位是基于性能的权衡,如果要花几小时加密和发邮件,或几分钟载入网站,没人愿意用。AES在性能和安全性之间取得平衡,如今AES被广泛使用,比如iPhone上加密文件、用WPA2协议在WiFi中访问HTTPS网站。
密钥交换
到目前为止,我们讨论过的加密技术都依赖于发送者和接收者都知道密钥。发件人用密钥加密,收件人用相同的密钥解密。以前,密钥可以口头约定,或依靠物品。比如德国人给英格玛配了密码本,上面有每天的配置。但是互联网时代没有办法这样做:你能想象打开密码本才能访问YouTube吗?我们需要某种方法在公开的互联网上传递密钥给对方。这看起来好像不安全,如果密钥被黑客拦截了,黑客不就能解密通信了吗?解决方案就是密钥交换(key exchange)。密钥交换是一种不发送密钥,但依然让两台计算机在密钥上达成共识的算法。我们可以使用单向函数(one-way function)来做到这一点。
用颜色来举例“单向函数”和“密钥加密”的原理
单项函数是一种数学操作,很容易算出结果,但想从结果逆向推算出输入非常困难。我们使用颜色进行比喻:将颜色混合在一起很容易,但是想知道混合了什么颜色很难,要尝试很多种可能才知道。在这个比喻下,我们的密钥是一种独特的颜色。首先有一个公开的颜色,所有人都可以看到,然后我和约翰各选择一个秘密颜色——只有自己才知道。
为了交换密钥,我把我的秘密颜色和公开颜色混合在一起,然后发送给约翰——写信发、用信鸽发,怎么样都行。约翰将他的秘密颜色和公共颜色也混合在一起并发送给我.
然后我在收到约翰的颜色之后再把我的秘密颜色加入进去。现在3种颜色混合在一起。John也做一样的事情。这样我们有了一样的颜色。
我们可以把这个颜色作为秘钥,尽管我们从来没有给对方发送过颜色。外部的人可以知道我们的公共颜色,或者我们发送给对方的颜色,但是终究无法知道我们通过一系列处理得到的最终颜色。
迪菲——赫尔曼密钥交换
数学单向函数是完美的,我们可以用迪菲-赫尔曼密钥交换(Diffe-Hellman Key Exchange)。