2014-04-17

Simplified DES是由Edard Schaefer教授开发的用于教学的简单加密算法,它与DES有着相似的属性与结构,只是参数比较小而已。通过这种简单的,能够实现手工加解密的算法能让我们加深对DES的理解。

概述

图1是simplified DES(下称S-DES)的总体结构图。S-DES加密算法使用8位明文(如10111101)和10位密钥作为输入,产生8位密文。相反的,S-DES解密算法使用8位密文和10位相同的密钥作为输入,生产8位明文。

加密算法包括5个函数:初始的置换函数(\(IP{}^{}\));一个复杂的函数\(f{}_{k}\),这个函数包括取决于输入的置换和替换操作;一个简单的置换函数\(SW\),用于置换输入数据的前后2个部分;然后又是\(f{}_{k}\);最后是初始置换函数的逆(\(IP{}^{-1}\))。

\(f{}_{k}\)的输入包括明文和8位密钥,我们可以使用16位的密钥,每一轮使用8位(共两轮\(f{}_{k}\)),也可以使用8位密钥,每一次都使用相同的密钥。作为折中,我们使用了10位密钥,每一次的\(f{}_{k}\)通过移位产生8位密钥。两个密钥的产生如图2:

这个算法中,密钥首先通过一个置换函数(\(P10\))。然后左移一位,输出通过一个置换函数(\(P8\)),产生第一个密钥\(K_{1}\)。左移一位之后的结果再进行移位和置换(\(P8\)),产生第二个密钥\(K_{2}\)。

我们将S-DES的加密算法使用函数组合表达如下:

\[IP^{-1}\circ f_{K_{2}}\circ SW\circ f_{K_{1}}\circ IP\]

也就是

\[ciphertext = IP^{-1}(f_{K_{2}}(SW(f_{K_{1}}(IP(plaintext)))))\]

其中

\[K_{1} = P8(Shift(P10(key))) K_{2} = P8(Shift(Shift(P10(key))))\]

解密算法也在图1中,可以表示成加密算法的逆运算。

\[plaintext = IP^{-1}(f_{K_{1}}(SW(f_{K_{2}}(IP(ciphertext)))))\]

S-DES密钥生成

图2显示了子密钥的生成。

首先,按照一定方式对输入密钥进行置换。如输入的10位密钥是\((k_{1},k_{2},k_{3},k_{4},k_{5},k_{6},k_{7},k_{8},k_{9},k_{10})\)。 \(P10\)如下定义:

\[P10(k_{1},k_{2},k_{3},k_{4},k_{5},k_{6},k_{7},k_{8},k_{9},k_{10}) = (k_{3},k_{5},k_{2},k_{7},k_{4},k_{10},k_{1},k_{9},k_{8},k_{6})\]

P10可以简单表示如下:

这个表的意思就是说第一个输出是输入的第3位,第二个输出是输入的第5位,以此类推。如,密钥1010000010被置换成1000001100。

接下来进行循环左移一位(LS-1),是将密钥分成左右两部分(每部分5位),左右各循环左移一位。这个例子中,得到00001 11000.

接着执行\(P8\),从10位输出中选出8位密钥,P8定义如下:

结果就是第一个子密钥(\(K_{1}\)),在我们这个例子中,是10100100。

然后利第一次左移一位产生的一对5位数据(00001 11000)进行左移两位。这个例子中的结果是00100 00011。最后,通过P8之后结果产生 \(K_{2}\)。这个例子中是01000011。

S-DES加密

图3展示了S-DES加密算法的细节。这部分详细介绍加密流程中的5个函数。

初始和结尾的置换函数:

对于输入的8位明文,我们需要使用\(IP\)对其进行重新置换:

在算法末尾,需要进行相反的操作:

可以验证\(IP^{-1}(IP(X)) = X\)。

\(f_{K}\)函数:

S-DES中最复杂的部分就是函数\(f_{K}\)了,这个函数包含了置换的和替换的组合。这个函数解释如下。首先让L和R分别表示\(f_{K}\)8位输入的左边4位和右边4位,F是一个4位到4位的映射。则

\[f_{K}(L,R) = (L\oplus F(R,SK),R)\]

SK是一个子密钥。

下面解释F。它的输入是4位数\((n_{1} n_{2} n_{3} n_{4})\),第一个操作是扩展与置换:

为了方便起见,写成如下形式:

将8位的子密钥\(K_{1} = (k_{11},k_{12},k_{13},k_{14},k_{15},k_{16},k_{17},k_{18})\)与上面的数进行异或:

重新命名这8个数:

前面4位用于在第一个S盒产生一个2位输出,后面4位在第二个S盒产生一个2位输出,两个S盒定义如下:

S盒操作如下:第一个和第四个输入作为一个2位数指定S盒中的一行,第二和第三个输入作为一个2位数指定S盒中的一列。比如\((p_{0,0}p_{0,3})=(00)\) 和\((p_{0,1}p_{0,2})=(10)\) ,则输出是S盒的第一行第二列这里是3(二进制的11),类似的\((p_{1,0}p_{1,3})\) 和\((p_{1,1}p_{1,2})\)的值找到在第二个S盒中的值。

接着,由两个S盒产生的4位置通过一个置换函数\(P4\):

\(P4\)的输出就是F的输出。

SW函数:

\(f_{K}\)函数仅仅处理左边的4位,SW函数将左右互换然后就处理了后面的4位。第二轮的\(f_{K}\)中,E/P,S0,S1和P4都跟第一轮一样的,只有子密钥变成了\(K_{2}\)。

在网上找到了一个S-DES的例子,希望大家能自己走一遍流程。

S-DES



blog comments powered by Disqus