长久以来,密码学的内部工作原理往往被认为是专家和数学家所独有的领域,而它的技术性也很大程度上被归功于魔法。但是,如果能把现代密码学复杂的本质讲出来,其实密码学也是可以理解的。然而,由于对英国提出的『加密禁令』和澳大利亚提出的『援助与访问法案』等主题缺乏了解而导致的许多全球运动,显然是弊大于利的做法。
如果你想要了解密码学,本文将会以速成课的形式讲到你需要知道的几乎所有知识。下面我将简要介绍各种加密系统的历史,并着重讲一下密码学中三种最流行的方向:流密码、分组密码以及公钥密码系统。
密码
密码是密码学的基石。密码就是一组处理信息加密和解密的算法。一个加密算法(E)需要一个密钥(k)和一段信息(m),就可以产生一段密文(c)。同样的,一个解密算法(D)需要一个密钥(k)和一个之前的密文(c)。可以表示成下面的形式:
这意味着要成为一个密码,它必须满足下面的等式才可以成功解密:
这个等式说明了如果你是用密钥 K 加密一段信息,那么你就可以通过密钥 K 解密出相同的信息。
作为最古老也最简单的密码之一的凯撒密码,就是用字母表中固定偏移位置的字母替换一段信息中的每一个对应的字母的加密方法。
在下面的例子中,信息中的每个字母就移动了三个字符:
这个密码可以用数学方法表示成下面的形式:
虽然这种加密方式符合我们对密码的定义,但是它一点也不安全。如果一个攻击者知道使用的是凯撒密码,那么他只需要尝试所有的 25 种组合就可以破译这个密码。即使他不知道使用的是凯撒密码,他也可以通过观察密文中的字母模式来发现使用的就是凯撒密码。
为了接下来要讨论的更安全的加密算法,我们不得不介绍一种运算:XOR(异或)。
XOR
XOR 或者说『异或』门是一种布尔数字逻辑门,它接收两个输入值 0 或者 1,如果这两个输入值不同则返回 1,如果相同则返回 0。它可以用下面的真值表来表示所有输入输出的可能:
这个运算常常用符号⊕来表示,就像下面这样:
0 ⊕ 0 = 0,
0 ⊕ 1 = 1,
1 ⊕ 0 = 1,
1 ⊕ 1 = 0
XOR 有以下几个重要的性质:
1.结合律:a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c
2.与自身运算得 0:a ⊕ a = 0
3.与 0 运算得它本身:a ⊕ 0 = a
这就意味着 a ⊕ b ⊕ a = b,因为根据上面的性质和法则我们知道 a ⊕ a ⊕ b 就等于 0 ⊕ b 等于 b。有一点很重要,那就是这个运算只对零和一有效,所有其他进制的数字必须要先转换成二进制。
87 ⊕ 73 = 1010111b ⊕ 1001001b = 0011110b = 30
现在我们可以开始讲我们第一个安全的密码了。
一次性密码本(One-time pads)
根据 Frank Miller 在 1882 年的描述,一次性密码本(同时也叫 Vernam 密码)就是用密钥和原文进行 XOR 来加密的,然后再用密钥和密文的 XOR 来解密获得原文。根据上面的属性,这样做显然是没有问题的,因为:a ⊕ b ⊕ a = b。一次性密码本定义的这一组加密算法可以用下面的式子表示:
这对密码的相容方程可以用下面的式子证明:
接下来,我们将会通过一个简单的例子来展示一次性密码本用起来有多简单。比如我我们要加密一个单词『Message』。第一步是将这个单词转换成二进制(只有零和一的表示形式)。我们可以根据 ASCII characte