DES是国际上商用保密通信和计算机通信的最常用的加密算法。美国国家标准局(NBS)于1977年公布了由IBM公司研制的一种加密算法,并批准把它作为非机要部门使用的数据加密标准(Data Encryption Standard),简称DES。

程序结构框架
该C程序有3个入口参数,Data、Key和Mode。其中Key为8字节共64位,是DES算法的工作密钥;Data也为8字节64位,是要被加密或解密的数据;Mode为工作方式;等于1时为加密,等于0时为解密。

程序首先由密钥Key通过密钥扩展算法得到16个子密钥,存放在k[0]—k[15]中。然后判断Mode的值,若Mode=0,即为解密,将子密钥数组k反置,即k[0]与k[15]互换、k[1]与k[14]互换,依此类推。

得到16个子密钥后,对Data作初始置换IP,再将置换后的Data分成两部分,前32位为L,后32位为R。然后从i=0到i=14作15轮循环,每次循环作如下工作:L=R;R=L⊕F(R,k[i])。共作15轮循环而非16轮,这是因为DES算法中作的16轮迭代,在最后一轮并不进行左右交换,所以把第16轮迭代在循环外单独实现,即在循环结束时作L=L⊕F(R,k[i])。

最后合并L、R即得到64位输出结果,Mode=1时输出的是密文,Mode=0时输出的是明文。

详解程序的几个关键部件
程序有几个关键部件,分别是;子密钥的生成,初始置换IP与其逆置换IP-1,F函数等。

1、子密钥的生成
从用户处得到的64位密钥Key中,每8位为一组,每组第8位是校验位。在加/解密过程中,校验位是没用的。所以首先将Key由缩减变换PC缩减到56位。具体实现过程如下:
把PC-1表存入数组pc1中,缩减时只需循环作K[i]=Key[pc1[i]]即可(56次)。

2、初始置换IP与其逆置换IP-1
初始置换IP与其逆置换IP-1的实现比较简单,方法类似于生成子密钥中的缩减变换PC-1和PC-2。也是把IP和IP-1表分别存入数组ip和fp中。然后通过查询这两个数组取得置换时输入的数据的对应位即可。

3、F函数的实现
F函数是DES算法的核心,DES算法执行效率的高低主要看F函数的设计实现,所以F函数的设计实现至关重要。

F函数的输入是DES算法各轮迭代中的R(i)和子密钥k(i),即程序中的R和k[i]。其中R为32比特数据,k[i]为48比特数据。算法首先要通过扩充变换E把R扩充为48比特。但实际编程时并不这样做,这是因为根据扩充变换E的自身特点,可以巧妙的利用移位来达到扩充的效果。在扩充变换E(m)=c中,E(m)的下标与m的下标的对应关系如表1所示。

把变换前的32比特数据先循环左移一位。然后如果右移26位,那么移位后的32比特数据的后6位正是按扩充变换得到的48比特数据的前6位;如果右移22位,那么移位后的后6位数据是按扩充变换得到的48比特数据的第7至第12位;以此类推,右移18位得到第13至18位,等等。这样就得到了6位为一组的,共计8组的数据。而恰好,F函数还要经8个S盒进行缩减变换,于是可以方便的把48比特子密钥也分成8组,分别与用R移位得到的8组数据作按位与运算。再把得到的8组数据分别经8个S盒作缩减变换。

最后F函数要经P置换得到输出结果,具体实现过程如下:
把P置换表存入数组p32中,然后求得P置换的逆置换放到数组pbox中。把S盒存储在二维数组si中。然后根据si中数据特点,通过数组pbox中数据把P置换和S盒缩减整合到一起,写成数组sp。之后,将上面所介绍的8组数据分别通过sp查询,就可直接得到输出结果。F函数定义如下:
浅析DES算法的C语言实现