当前位置:首页 >资讯 >DES算法的C语言简单实现


DES是世界上最常用的商用保密通信和计算机通信加密算法。美国国家标准局(NBS)于1977年公布了IBM开发的加密算法,并批准将其作为非机要部门使用的数据加密标准(Dataencryptionstandard),简称DES。

程序结构框架

C程序有三个入口参数,Data.Key和Mode。其中,Key有64个8字节,是DES算法的工作密钥;Data也有64个8字节,是要加密或解密的数据;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=LF(R,K[i])。由于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-1相比,初始置换IP的实现相对简单,其方法类似于生成子密钥中的缩减变换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个S盒缩减和转换获得的8组数据。

最后,F函数通过P置换获得输出结果,具体实现过程如下:

将P置换表存储在数组p32中,然后将P置换的逆置换放入数组pbox中。将S盒存储在二维数组si中。然后,根据si中的数据特性,将P置换和s盒缩减并集成到数组pbox中的数据中,并将其写入数组sp过sp查询可以直接获得上述8组数据的输出结果。F函数定义如下:

C语言实现分析DES算法。