对称密码(共享密钥密码)

1,579 阅读9分钟

用相同的密钥进行加密和解密

1. 一次性密码本(绝对不会被破译的密码)

一次性密码本又称维纳密码
即便用暴力破解法遍历整个密钥空间,一次性密码本也绝对无法被破解
原理将明文与一串随机的比特序列进行XOR运算
解密就是加密的反向运算,即用密文和密钥进行XOR运算,就可以得到明文
一次性密码本是无法破译的,即便能够解密出来完整的字符也无法判断它是否是正确的明文
一次性密码本是无条件安全的,在理论上是无法破译的

但是在现实中很不实用,几乎没有人应用一次性密码本,原因如下:

  • 密钥的配送:最大的问题在于密钥的配送
  • 密钥的保存:密文无需保存,但密钥需要保存
  • 密钥的重用:在一次性密码本中,绝对不能重用过去用过的随机比特序列
  • 密钥的同步:发送者和接收者的密钥的比特序列不允许有任何错位,否则错位的比特后的所有信息都将无法解密
  • 密钥的生成:需要生成大量的随机数,这里的随机数不是通过计算机程序生成的伪随机数,而必须是无重现性的真正随机数

因此,能够使用一次性密码本的,只有那些机密性重过一切,且可以花费大量财力和人力来生成并配送密钥的场合。所以,一次性密码本是一种几乎没有实用性的密码

2. DES

2.1 DES加密和解密

DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥长度是56比特
DES是以64比特的明文为一个单位来进行加密的,这个64比特的单位称为分组
以分组为单位进行处理的密码算法称为分组加密,DES就是分组密码的一种
DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),迭代的具体方式就称为模式

下图为DES的加密与解密

企业微信截图_20221214121330.png

2.2 DES的结构(Feistel网络)

DES的基本结构是由Horst Feistel设计的,因此也称为Feistel网络(Feistel network)、Feistel结构(Feistel structure)或者FeiStel密码(Feistel cipher)
在Feistel网络中,加密的各个步骤称为,整个加密过程就是进行若干次轮的循环

DES是一种16轮循环的Feistel网络,下图展现的是Feistel网络中一轮的计算流程:

企业微信截图_20221214122241.png

  • 将输入的数据等分为左右两部分
  • 将输入的右侧直接发送到输出的右侧
  • 将输入的右侧发送到轮函数
  • 轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列
  • 将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧

子密钥只是一个局部密钥,只在一轮中使用
轮函数的作用是根据“右侧”和子密钥生成对“左侧”进行加密的比特序列,它是密码系统的核心

下图是3轮的Feistel网络加密:

企业微信截图_20221214144859.png

用相同的子密钥运行两次Feistel网络就能够将数据还原,如下图所示:

企业微信截图_20221214145543.png

下图是3轮的Feistel网络解密:

企业微信截图_20221214145813.png

Feistel网络的解密操作只要按照相反的顺序来使用子密钥就可以完成,Feistel网络本身的结构,在加密和解密时都是完全相同的

Feistel网络的性质:

  • Feistel网络的轮数可以任意增加
  • 加密时无论使用任何函数作为轮函数都可以正确解密
  • 加密和解密可以用完全相同的结构来实现

无论是任何轮数、任何轮函数,Feistel网络都可以用相同的结构实现加密和解密,且加密的结果必定能够正确解密

2.3 差分分析与线性分析

差分分析是一种针对分组密码的分析方法,改变一部分明文并分析密文如何随之改变。通过分析密文改变中所产生的偏差,可以获得破译密码的线索
线性分析是将明文和密文的一些对应比特进行XOR并计算结果为零的概率
差分分析和线性分析都有一个前提,就是假设密码破译者可以选择任意明文并得到其加密的结果,这种攻击方式称为选择明文攻击

3. 三重DES

DES已经可以在现实的时间内被暴力破解,因此需要一种用来代替DES的分组密码,三重DES就是出于这个目的被开发出来的。

三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称TDEA,通常缩写为3DES

3.1 三重DES的加密

三重DES的加密机制如图所示:

企业微信截图_20221214154054.png

明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度是56×3=168比特;
三重DES是加密->解密->加密的过程,目的是为了让三重DES能够兼容普通的DES;
当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了
三重DES对DES具备向下兼容性
如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥,这种三重DES就称为DES-EDE2
EDE表示的是加密->解密->加密这个流程
密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES成为DES-EDE3

3.2 三重DES的解密

三重DES的解密过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序执行解密->加密->解密的操作
如下图所示:

企业微信截图_20221215143814.png

3.3 三重DES的现状

尽管三重DES目前还被银行等机构使用,但其处理速度不高,除了特别重视向下兼容性的情况以外,很少被用于新的用途。

4.AES的选定过程

AES是取代其前任标准DES而称为新的标准的一种对称密码算法

全世界的企业和密码学家提交了多个对称密码算法作为AES的候选,最终在2000年从这些候选算法中选出了一种名为Rigndael的对称密码算法,并将其确定为了AES。
通过竞争来实现标准化的方式,是密码算法选拔的正确方式。由世界最高水平的密码学家共同尝试破译,依然未能找到弱点,只有这样的事实才能够证明一种密码算法的强度。

5. Rijndael

Rijndael是由比利时密码学家Joan Daemen和Vincent Rijmen设计的分组密码算法,于2000年被选为新一代的标准密码算法——AES。
Rijndael的分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。

5.1 Rijndael的加密和解密

Rijndael算法也是由多个轮构成的,其中每一轮分为SubBytes、ShiftRows、MixColumns和AddRoundKey共4个步骤。
Rijndael使用了SPN结构。

Rijndael的输入分组为128比特,即16字节

  • 首先,需要逐个字节地对16字节地输入数据进行SubBytes处理。
    SubBytes就是以每个字节的值(0~255的任意值)为索引,从一张拥有256个值的替换表中查找出对应值的处理,如下图所示:
    企业微信截图_20221215174355.png
  • SubBytes之后需要进行ShiftRows处理
    这一步是将以4字节为单位的行(row)按照一定的规则向左平移,且每一行平移的字节数是不同的,如下图所示: 企业微信截图_20221215174502.png
  • ShiftRows之后需要进行MixColumns处理。
    这一步是对一个4字节的值进行比特运算,将其变为另外一个4字节值,如下图所示: 企业微信截图_20221215174756.png
  • 最后,需要将MixColumns的输出与轮密钥进行XOR,即进行AddRoundKey处理。
    下图所示为AddRoundKey中对其中1个字节进行处理的情形
    企业微信截图_20221215175135.png

此为Rijndael的一轮计算,实际上,在Rijndael中需要重复进行10~14轮计算。
我们输入的所有比特在一轮中都会被加密,所以加密所需的轮数就更少。
SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行计算

在Rijndael的加密过程中,每一轮所进行的处理为:
SubBytes->ShiftRows->MixColumns->AddRoundKey
在解密时,则是按照相反的顺序来进行,即:
AddRoundKey->InvMixColumns->InvShiftRows->InvSubBytes
其中,AddRoundKey是与轮密钥进行XOR运算,因此这一步在加密和解密时是完全相同的,剩下的步骤中名字前面都带有Inv,表示与原始步骤相对应的逆运算。

InvMixColumns(混合列):

企业微信截图_20221216093938.png

InvShiftRows(平移行):

企业微信截图_20221216093956.png

InvSubBytes(逐字节替换):

企业微信截图_20221216094009.png

Rijndael的算法背后有着严谨的数学结构,也就是说从明文到密文的计算过程可以全部用公式来表达,这是以前任何密码算法都不具备的性质。
如果Rijndael的公式能够通过数学运算来求解,意味着Rijndael能够通过数学方法进行破译,这也为新的攻击方式的产生提供了可能。不过这只是一种假设,实际上到现在为止还没有出现针对Rijndael的有效攻击。

现在大家应该使用的是AES,因为它安全、快速,而且能够在各种平台上工作。
一般来说,我们不应该使用任何自制的密码算法,而是应该使用AES。因为AES在其选定过程中,经过了全世界密码学家所进行的高品质的验证工作,而对于自制的密码算法则很难进行这样的验证。