密码学之资料加密标准(DES)
前言
接着前文的SPN,但是和前文的关系不大,所以不看前文也照样可以阅读本文。

一、Feistel Network
Feistel Network 分为balanced 和 unbalanced 两种。balanced 的情况下,我们把输入的长度为 的bits分成长度相等的左右两个部分(叫做
和
);unbalanced 的情况下,左右两个部分长度不等。
Feistel network 一共有多轮组成,每一轮中,我们通过一个key schedule从我们的master key k中抽出我们的round key ,然后我们将右半部分
和我们的
一同输入到我们预设的round function 中
. 然后做一个XOR运算:
,
.


二、Data Encryption Standard (DES)
DES是一个运用Feistel Network来进行加密的流程,输入的比特序列的长度(同时也是block length)为64 bits, master key的长度为56 bits,一共进行16轮Feistel运算。
因为是20世纪70年代提出来的加密标准,现在看来56 bits的master key太短了,所以已经不再被推荐使用。
*注意,DES是一个严格的加密流程,很多函数、矩阵都有预设值,但由于篇幅原因,这些预设值不在本文中列举出来。
DES的具体流程如下,首先我们有一个初始的permutation叫做 ,以及它的逆运算
.
定义了我们输入序列的shuffle方式,比方说——
,代表了输入值的第4个bit移动到输出值的第1个bit的位置上,输入值的第3个bit移动到输出值的第2个bit的位置上,以此类推下去。所以,其逆运算
.

我们在最开始的时候用来对输入的plaintext的所有bit切换顺序,在最末尾的时候,用
对我们的block再一次切换顺序然后输出我们的ciphertext.

然后,我们进行Feistel加密运算,只不过在这里,我们的round function是一个SPN block.

如图所示,我们给出一个32-bit的序列R ,然后进行一个扩张运算: ,E是一个预设的表格,比方说,给出一个4-bit的序列,
将输出一个6-bit的序列。其中,原输入值的第1位的bit和第2位的bit重复出现了1次,以此来实现扩张。

接下来我们做一个xor运算:(显然我们的round key长度为48 bits)。然后我们将
切分为8个长度为6 bits的值,每一个6-bit的子序列都输入到一个S-Box:
中。
我们的S-Box由一个4行16列的表格组成。
比方说,我们的输入的序列如下:

绿色位置的比特将决定我们的行,橘红色位置的比特将决定我们的列,所以在此情况下,我们绿色位置的两个比特00,和橘红色位置的4个比特1101,决定了我们是第0行第13列。我们在我们的S-Box表格中检索第0行第13列后,返回的那个值就是我们的输出值。
在这里,我们8个小块,每一个小块的S-box都是不同的,所以我们一共有8种不同的S-box。
最后我们将我们S-box的输出值合并起来,用一个permutation函数再将合并后的值进行shuffle.

三、Triple Data Encryption Algorithm (TDEA)
TDEA(或者也叫做3-DES、TDES)是利用DES作为一个基本模块,我们依旧使用长度为56 bits的key和64 bits的输入值,但在这里我们有3个master key .我们对输入的plaintext m做如下的运算:
其中为DES加密运算,
是
的逆向运算(即解密运算)。
还有一个版本是使用2个master key的TDEA,公式和上述公式差不多,只是把替换为
,该版本已经不再被推荐使用。

后记
下一篇文章介绍AES。
参考资料:
Jonathan Katz; Yehuda Lindell - Introduction to Modern Cryptography; Third Edition
FIPS 46-3, Data Encryption Standard
使用工具:Drawio: https://app.diagrams.net/

THE END.