MENU

密码技术系列 Part 1 - 对称加密

在如今这个信息爆炸的时代,每个人的生活都跟信息安全紧密相关。商业公司贪婪的攫取用户信息,虽然一定程度上这带来了更好的服务,但是一旦发生信息泄露造成的危害也会成倍放大。例如:天朝各类实名制的推行,非但没能遏制电信诈骗等犯罪反而起了反作用。究其原因,无非是实名制所采集的信息没有得到严格的保护为他人所用。作为数字信息的第一道把门者程序员来说,除了基本的职业道德之外还需要提高自己的知识水平最大限度的保护用户的信息安全。

自从人类社会有了秘密,加密和解密技术就一直在左右互搏的过程中向前发展。尤其是在近现代的几次大战和技术革新中更是得到了突飞猛进的发展。接下来我会用几篇文章简单的介绍数字世界中的密码技术,看一看当今世界的信息流通的基石。

对称密码

所谓对称密码就是在对信息加密和解密的过程中使用的是同一种密钥。该方式也是人类历史上使用最悠久的信息加密方式,它的过程如下:

1

对称加密的数学基础

对称密码加密中一个关键是:信息的发送者和介绍者能够使用同一个密钥对其进行正确操作。例如:最简单的凯撒密码就是通过将字母表中的字母进行平移加密,然后接受者再进行反向操作就能还原信息。

我们都知道计算机世界中所有的信息在传输的过程中会先被转换成二进制代码,然后在线路中用高低电平的形式进行表示。显然对于二进制的数字世界来说,加密算法需要的是数学做为支撑。而这个加密算法的数学基础就是二进制的异或操作。异或运算规则一句话总结就是:相同数字结果为 0 ,反之结果为 1 。这表明异或操作具有如下特性:(A ^ B ) ^ B = A,因为上面运算可以改写为 A ^ (B ^ B ) = A ^ ( 0000 0000 ...) = A。这也就意味着上述公式中的 B 正好满足对称加密中的密钥要求。

DES 与三重 DES 加密

虽然 DES 加密算法应该在所有新项目的加密方案名单之外,但是我们还是可以了解下其中的内容。DES 是一种将 64 位比特的明文加密成 64 位比特密文的算法。从严格意义上来说 DES 的密钥长度是 56 比特,因为每隔 7 比特位都会有一个校验位。

DES 算法每次只能以 64 比特位为单位进行加密,这种以单位分组进行处理的加密算法称为分组密码。如果位数不足需要补足,反之如果超过一组的话就需要对 DES 加密过程进行迭代,而迭代的具体过程被称为模式

DES 的基本结构是由 Horst Feistel 设计的,因此也称为 Feistel 网络。在 Feistel 网络中,加密的各个步骤被称为,整个加密过程就是进行若干次的轮循环。DES 是一种 16 轮的 Feistel 网络,Feistel 网络的处理过程如图:

Feistel

我们将输入的 64 比特位明文平分为左右两个部分,然后使用右侧 32 比特位、轮函数和本轮子密钥一起对左侧进行加密得到左侧的密文。当然加密工作只完成了一半右侧还没有实现加密,所以下一轮加密过程中我们想将此轮的到的结果进行左右互换。

因为 DES 算法被攻破失去了显示意义,所有后来又有了改进类型的三重 DES 加密算法。三重 DES 算法就是将 DES 过程重复三次得到的一种密码算法,通常缩写为 3DES。3DES 算法的实际密钥长度为 128 位,其加密过程如下图:

3DES

从图中我们可以发现,3DES 的算法过程不是三次加密,而是 加密 -> 解密 -> 加密。在加密算法中进行解密操作让人感觉不可思议,其实这个方法是 IBM 为了兼容 DES 算法提出来的。 当三次 DES 过程使用的同一密钥的时候其实 3DES 就退化成了 DES。

了解加密操作之后,解密也不过是加密步骤的逆向操作而已。

AES 加密

AES 是用来取代 DES 而产生的一种新的对称加密的新标准,AES 方案采用的加密算法是 Rijndael 。在 Rijndael 算法描述中分组长度和密钥长度可以分别以 32 比特位单位在 128 ~ 256 比特范围内进行选择。不过在 AES 的官方规则中,分组长度被固定为 128 比特,密钥长度有 128、192、256 比特位三种。

与 DES 加密过程一样,AES 的加密过程也是有多轮操作构成的,每一轮的步骤分别为 SubBytes、ShiftRows、MixColumns、AddRoundKey

Rijndael 的输入分组为 16 个字节共 128 比特位。首先第一步就是对输入分组的字节进行 SubBytes 操作,也就是以每个字节的值(0 ~ 255)作为索引在对照表中找到对应的值进行替换。操作步骤如下图:

AES-SubBytes

接下来就是对 SubBytes 的输出进行 ShiftRow 处理,也就是将上一步得到的结果以 4 字节为单位进行行左移,且每一行平移的字节数是不同的。操作步骤如下图:

AES-ShiftRows

ShiftRow 之后接着就是对其结果进行 MixColumns 处理。这需要对一个 4 字节组成的值进行矩阵运算,将其变为另一个数字。下图操作就是对其中第二列进行了 MixColumns 处理:

AES-MixColumns

该轮的最后操作就是对 MixColumns 的结果进行 AddRoundKey,也就是将上一步的处理结果与原输入进行异或操作。到这里,Rijndael 的一轮处理就结束了,后面都是重复的轮计算。MixColumns操作图示如下:

AES-AddRoundKey

通过这一轮操作下来,一组 128 比特位的明文输入都得到的加密。相较 DES 中的Feistel 网络每轮只加密一半输入,加密的次数可以明显的减少。

总结

上面对对称密码,以及 DES、三重 DES、AES 加密算法进行了介绍。由于 DES 的暴力破解早就实现了,所有任何新的项目都不该使用改方案。其次,除非兼容性是必要的考虑,否则也没有任何其它理由在新的项目中使用三重 DES。AES 作为得到全世界密码学家验证的的算法,其安全性是有一定保障的。所以它应该是对称密码中的首选方案,并且我们应该选择 256 这种最复杂的加密方案来确保信息安全。当然,所有的对称加密都有一个难题,那就是密钥的分配和传输。这个问题的解决就需要下个部分会提到的公钥密码技术。

标签: 加密