DES算法初探

本篇博客为阅读《深入浅出密码学——常用加密技术原理与应用》一书,内容有所参考和引用,部分图片和表格采用了原文,版权归原书和原作者所有,如有侵权请告知删除,在此表示感谢!

DES算法是一种典型的对称加密算法,关于对称加密算法的介绍可参照我的另外一篇博客。DES算法已经不再安全,因为它的密钥空间实在太小,然而DES算法的设计理念比较优秀,是研究密码学的基础。


1. 序列加密和分组加密

对称加密分为分组加密和序列加密两部分。简单区分两者为:序列加密单独加密明文的每一位,分组加密则是加密明文的每一组(首先需要按照一定长度将明文分为若干组)。DES算法是一种典型的分组加密。


2. 混淆(Confusion)与扩散(Diffusion)

混淆与扩散是强加密算法中的两种原子性的操作。根据原书解释,混淆是一种使密钥和密文之前的关系尽可能模糊的加密操作,如今实现混淆常用的手段就是替换(替换字符本身);扩散是一种为了隐藏明文的统计属性而将明文符号的影响扩散到多个密文符号的加密操作,最简单的扩散方式就是位置换(改变字符位置)。

仅仅执行混淆或者扩散的密码是不安全的。仅仅执行混淆的经典例子是移位密码(也即将明文中每个字母在字母表中移动固定长度的位置,这种加密算法很容易通过蛮力攻击或者字母频率分析的方式攻破)。一般来说是将混淆和扩散进行几级串联,从而建立一个更强壮的密码,这样的密码称为乘积密码,如图1所示

DES算法初探_第1张图片
图1 乘积密码


3. DES算法内部结构

DES算法使用56位密钥对分组为64位的明文进行分组加密,它是一种迭代算法,对明文中每个分组的加密过程都包括16轮,每一轮的操作完全相同,图2显示了DES的轮结构,每一轮使用不同的子密钥,所有子密钥ki都是从主密钥k中推导出来的。

DES算法初探_第2张图片
图2 DES的轮结构


3.1 Feistel结构
DES算法内部使用的是Feistel结构,Feistel结构是用于分组密码中的一种对称结构,它对信息的加密和解密过程极为类似,甚至完全一样,这就使得在实施过程中,对编码量和线路传输的要求就减少了几乎一半。下图所示是DES的Feistel结构

DES算法初探_第3张图片
图3 Feistel结构

将64位的明文x进行初始置换IP后,再分为L0和R0两部分,然后输入到Feistel结构,进行16轮操作,每一轮操作中,右半部分Ri和这轮的子密钥ki被送入函数f中,所得结果再与左半部分Li进行XOR操作,最后,两半部分交换。整个过程可以表示为:

Li=Ri1 ,

Ri=Li1f(Ri1,ki)

其中i=1,2,3…,16。16轮计算结束后,左半部分和右半部分将再次交换。最后再进行逆初始变换IP-1。每一轮中的轮密钥ki均来自56位的主密钥k,生成轮密钥的过程称为密钥编排(Key schedule)。

Feistel结构在每轮中只加密输入位的一半,即输入的左半部分,右半部分则原样复制到下一轮。因此,可以将f函数视为输入参数为Ri-1和ki的随机数生成器,该随机数生成器使用XOR操作来加密输入的左半部分Li-1,如果攻击者不能预测出f函数的输出,那么说明这个加密方法是强壮的,在此前提下,Feistel密码的安全性也会随着密钥的位数和操作的轮数的增加而增强。

3.2 初始置换IP(x)和逆初始置换IP-1
在进入Feistel结构之前,首先需要进行初始置换;Feistel结构结束后,需要进行逆初始置换,两者互为逆操作。初始置换和逆初始置换都是按位置换,可以形象地看作是交叉连接,如图4和图5所示

DES算法初探_第4张图片
图4 初始置换

DES算法初探_第5张图片
图5 逆初始置换

详细的置换表如图6和图7所示

DES算法初探_第6张图片
图6 初始置换表

DES算法初探_第7张图片
图7 初始置换表


3.3 f函数
f函数的结构如图8所示

DES算法初探_第8张图片
图8 f函数结构

其流程为:

  1. 扩充(E-盒操作):引入扩散。将输入分为8个4位的分组,再将每个分组扩展为6位,从而将输入扩展为48位。这个过程在E-盒中进行(E-盒本质上是一种数学置换),图9表示置换过程,图10表示对应的置换表

    DES算法初探_第9张图片
    图9 扩充函数E

    DES算法初探_第10张图片
    图10 扩充置换表

  2. S-盒操作:引入混淆。将第一步得到的8组6位的分组送入到不同的S-盒(S-盒是一种替换盒,本质上是一个查找表)中,将6位的输入映射成4位的输出。每个S-盒含有26=64项,可以看成一个4行16列的表格,每一项是一个4位的值。图11给出了S-盒表格的读取方式:每个6位输入中的最高位(MSB)和最低位(LSB)组成的二进制数表示要选择的表行(行号从0开始),其余4位组成的二进制数表示要选择的表列(列号从0开始)。图12-19则给出了所有的S-盒表格。

    DES算法初探_第11张图片
    图11 S-盒表格的读取方式,例子:使用S-盒S 1
    输入为100101 2,选择第3(11 2)行第2(0010 2)列,输出为8(1000 2)

    DES算法初探_第12张图片
    图12 S-盒S 1

    DES算法初探_第13张图片
    图13 S-盒S 2

    DES算法初探_第14张图片
    图14 S-盒S 3

    DES算法初探_第15张图片
    图15 S-盒S 4

    DES算法初探_第16张图片
    图16 S-盒S 5

    DES算法初探_第17张图片
    图17 S-盒S 6

    DES算法初探_第18张图片
    图18 S-盒S 7

    DES算法初探_第19张图片
    图19 S-盒S 8

    S-盒是DES算法的核心,也是该算法中唯一的非线性元素(即 S(a)S(b)S(ab) ),并提供了混淆,如果一个加密算法中没有非线性元素,攻击者很容易通过一些已知的明文-密文对片段,使用一个线性等式系统来表示输入和输出,通过求解这个线性等式系统,就有可能破译该算法。

    作为DES算法中唯一的非线性元素,S-盒的设计至关重要。NIST(美国国家标准与技术局,原美国国家标准局NBS。DES算法的诞生和发展有很多的历史背景,有兴趣可参考维基百科)公布的S-盒的设计准备如图20所示

    DES算法初探_第20张图片
    图20 S-盒设计准则

  3. 置换:引入扩散。每个S-盒的4位输出都会进行置换,使得在每一位在下一轮中会影响多个不同的S-盒操作。通过反复迭代的扩散,每个密文位都将是每个明文位和每个密钥位的函数,这也称为雪崩效应。置换P如图21所示

    DES算法初探_第21张图片
    图21 置换P


3.4 密钥编排
密钥编排的目的是从原始的56位密钥中得到16个轮密钥(也称为子密钥),每个轮密钥长度是48位。需要注意的是DES输入密钥的长度是64位,其中每第8位都作为前7位的奇偶检验位,这8个奇偶检验位都不是真正的密钥位,因此实际上DES算法的密钥空间是56位的。密钥编排的流程图如图22所示

DES算法初探_第22张图片
图22 密钥编排流程图

过程如下:

  1. 初始置换PC-1(置换选择1):去除校验位,将64位密钥缩短为56位,置换表格如图23所示

    DES算法初探_第23张图片
    图23 初始置换PC-1

  2. 循环移位:将第一步得到的56位密钥分为C0和D0两个部分,长度均为28位的左右两部分将周期性的左移一位或者两位,移动的具体位数取决于轮数i,规则如下:

    • 在第i=1,2,9,16轮中,左移一位
    • 其他轮中,左移两位

    循环移位要么发生在左半部分,要么发生在右半部分,移动位置总数是4*1+12*2=28。

  3. 置换选择2(PC-2):通过再一次置换从56位密钥(C0和D0)中获取48位轮密钥ki,过程如图24

    DES算法初探_第24张图片
    图24 置换选择2(PC-2)


4. DES算法安全性分析

一般来说,密码攻击手段有两种:蛮力攻击(穷尽密钥搜索)和分析攻击。DES算法遭受批评的原因主要有:

  • 密钥空间太小,易受蛮力攻击
  • S-盒设计准则保密的,有可能已经存在利用S-盒数学属性的分析攻击,但是只有DES设计者知道(详见DES历史)

然而到目前为止,尚未发现能高效破解DES的攻击方式,不过通过蛮力攻击的方式能够比较容易的破解单重DES,因此对大多数程序而言,单重DES已经不再使用,取而代之的是3DES和AES。

你可能感兴趣的:(DES算法初探)