DES算法及其VC源代码_第1页
DES算法及其VC源代码_第2页
DES算法及其VC源代码_第3页
DES算法及其VC源代码_第4页
DES算法及其VC源代码_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DES算法及其在VC+6.0下的实现(上)摘要:本文介绍了一种国际上通用的加密算法DES算法的原理,并给出了在VC+6.0语言环境下实现的源代码。最后给出一个示例,以供参考。关键字:DES算法、明文、密文、密钥、VC;本文程序运行效果图如下:正文:当今社会是信息化的社会。为了适应社会对计算机数据安全保密越来越高的要求,美国国家标准局(NBS)于1997年公布了一个由IBM公司研制的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称DES(Data Encrypton Standard)。自公布之日起,DES算法作为国际上商用保密通信和计算机通信的最常用算法,一直活跃在国际保密通信的舞台

2、上,扮演了十分突出的角色。现将DES算法简单介绍一下,并给出实现DES算法的VC源代码。DES算法由加密、解密和子密钥的生成三部分组成。一加密DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:DES算法加密过程对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:IP5850423426181026052443628201246254463830221466456484032241685749413325179

3、1595143352719113615345372921135635547393123157该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规则为:f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。R16与L16合并成64位的比特串

4、。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:IP-140848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725经过置换IP-1后生成的比特串就是密文e.。下面再讲一下变换f(Ri-1,Ki)。它的功能是将32比特的输入再转化为32比特的输出。其过程如图所示:对f变换说明如下:输入Ri-1(32比特)经过变换E后,膨胀为48比特。膨胀后的比特串的

5、下标列表如下:E:32123454567898910111213121314151617161718192021202122232425242526272829282930313231膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换后,其下标列表如下:P:1672021291228171152326518311028241432273919133062211425经过P变换后输出的比特串才是32比特的f (Ri-1,Ki)。下面再讲一下S盒的变换过程。任取一S盒。见图:在其输入b1,b2,b3,b4,b5,b6中

6、,计算出x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再从Si表中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。(S表如图所示)至此,DES算法加密原理讲完了。在VC+6.0下的程序源代码为:for(i=1;i=64;i+) m1i=mipi-1;/64位明文串输入,经过IP置换。下面进行迭代。由于各次迭代的方法相同只是输入输出不同,因此只给出其中一次。以第八次为例:/进行第八次迭代。首先进行S盒的运算,输入32位比特串。for(i=1;i=48;i+)/经过E变换扩充,由32位变为48位 RE1i=R7Ei-1;for(i=1;i=48;i+)/与K8按

7、位作不进位加法运算 RE1i=RE1i+K8i;for(i=1;i=48;i+) if(RE1i=2) RE1i=0; for(i=1;i7;i+)/48位分成8组s11i=RE1i;s21i=RE1i+6;s31i=RE1i+12;s41i=RE1i+18;s51i=RE1i+24;s61i=RE1i+30;s71i=RE1i+36;s81i=RE1i+42;/下面经过S盒,得到8个数。S1,s2,s3,s4,s5,s6,s7,s8分别为S表s1=s1s116+s111*2s115+s114*2+s113*4+s112*8;s2=s2s216+s211*2s215+s214*2+s213*4

8、+s212*8;s3=s3s316+s311*2s315+s314*2+s313*4+s312*8;s4=s4s416+s411*2s415+s414*2+s413*4+s412*8;s5=s5s516+s511*2s515+s514*2+s513*4+s512*8;s6=s6s616+s611*2s615+s614*2+s613*4+s612*8;s7=s7s716+s711*2s715+s714*2+s713*4+s712*8;s8=s8s816+s811*2s815+s814*2+s813*4+s812*8;for(i=0;i8;i+)/8个数变换输出二进制for(j=1;j5;j+)

9、tempj=si+1%2; si+1=si+1/2;for(j=1;j5;j+) f4*i+j=temp5-j;for(i=1;i33;i+)/经过P变换 frki=fPi-1;/S盒运算完成for(i=1;i33;i+)/左右交换 L8i=R7i;for(i=1;i33;i+)/R8为L7与f(R,K)进行不进位二进制加法运算结果 R8i=L7i+frki;if(R8i=2) R8i=0; 其它各次迭代类似,可以依此类推。二子密钥的生成64比特的密钥生成16个48比特的子密钥。其生成过程见图:子密钥生成过程具体解释如下:64比特的密钥K,经过PC-1后,生成56比特的串。其下标如表所示:PC

10、-157494133251791585042342618102595143352719113605244366355473931231576254463830221466153453729211352820124该比特串分为长度相等的比特串C0和D0。然后C0和D0分别循环左移1位,得到C1和D1。C1和D1合并起来生成C1D1。C1D1经过PC-2变换后即生成48比特的K1。K1的下标列表为:PC-21417112415328156211023191242681672720132415231374755304051453348444939563453464250362932C1、D1分别循环

11、左移LS2位,再合并,经过PC-2,生成子密钥K2依次类推直至生成子密钥K16。注意:Lsi (I =1,2,.16)的数值是不同的。具体见下表:迭代顺序12345678910111213141516左移位数1122222212222221生成子密钥的VC程序源代码如下: for(i=1;i57;i+)/输入64位K,经过PC-1变为56位 k0i=kPC_1i-1;56位的K0,均分为28位的C0,D0。C0,D0生成K1和C1,D1。以下几次迭代方法相同,仅以生成K8为例。 for(i=1;i27;i+)/循环左移两位 C8i=C7i+2; D8i=D7i+2;C827=C71;D827=

12、D71;C828=C72;D828=D72;for(i=1;i=28;i+) Ci=C8i; Ci+28=D8i;for(i=1;i=48;i+) K8i=CPC_2i-1;/生成子密钥k8注意:生成的子密钥不同,所需循环左移的位数也不同。源程序中以生成子密钥 K8为例,所以循环左移了两位。但在编程中,生成不同的子密钥应以Lsi表为准。 三解密DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。第一圈:加密后的结果L=R15, R=L15f(R15,K16)f(R15,K16)=L15同理

13、R15=L14f(R14,K15), L15=R14。同理类推:得 L=R0, R=L0。其程序源代码与加密相同。在此就不重写。四示例例如:已知明文m=learning, 密钥 k=computer。明文m的ASCII二进制表示:m= 01101100 01100101 01100001 0111001001101110 01101001 01101110 01100111密钥k的ASCII二进制表示:k=01100011 01101111 01101101 0111000001110101 01110100 01100101 01110010明文m经过IP置换后,得:11111111 000

14、01000 11010011 10100110 00000000 11111111 01110001 11011000等分为左右两段:L0=11111111 00001000 11010011 10100110 R0=00000000 11111111 01110001 11011000经过16次迭代后,所得结果为:L1=00000000 11111111 01110001 11011000 R1=00110101 00110001 00111011 10100101L2=00110101 00110001 00111011 10100101 R2=00010111 11100010 1011

15、1010 10000111L3=00010111 11100010 10111010 10000111 R3=00111110 10110001 00001011 10000100L4=00111110101100010000101110000100 R4=11110111110101111111101000111110L5=11110111110101111111101000111110 R5=10010110011001110100111111100101L6=10010110011001110100111111100101 R6=11001011001010000101110110100

16、111L7=11001011001010000101110110100111 R7=01100011110011101000111011011001L8=01100011110011101000111011011001 R8=01001011110100001111001000000100L9=01001011110100001111001000000100 R9=00011101001101111010111011100001L10=00011101001101111010111011100001 R10=11101110111110111111010100000101L11=1110111

17、0111110111111010100000101 R11=01101101111011011110010111111000L12=01101101111011011110010111111000 R12=11111101110011100111000110110111L13=11111101110011100111000110110111 R13=11100111111001011010101000000100L14=11100111111001011010101000000100 R14=00011110010010011011100001100001L15=000111100100100

18、11011100001100001 R15=01010000111001001101110110100011L16=01010000111001001101110110100011 R16=01111101101010000100110001100001其中,f函数的结果为:f1=11001010001110011110100000000011 f2=00010111000111011100101101011111f3=00001011100000000011000000100001 f4=11100000001101010100000010111001f5=10101000110101100

19、100010001100001 f6=00111100111111111010011110011001f7=11110101101010011100000100111100 f8=10000000111110001010111110100011f9=01111110111110010010000000111000 f10=10100101001010110000011100000001f11=01110000110110100100101100011001 f12=00010011001101011000010010110010f13=10001010000010000100111111111

20、100 f14=11100011100001111100100111010110f15=10110111000000010111011110100111 f16=0110001111100001111101000000000016个子密钥为:K1=11110000101111101110111011010000 K2=11100000101111101111011010010101K3=11110100111111100111011000101000 K4=11100110111101110111001000011010K5=11101110110101110111011100100110 K

21、6=11101111110100110101101110001011K7=00101111110100111111101111100110 K8=10111111010110011101101101010000K9=00011111010110111101101101000100 K10=00111111011110011101110100001001K11=00011111011011011100110101101000 K12=01011011011011011011110100001010K13=11011101101011011010110110001111 K14=110100111

22、01011101010111110000000K15=11111001101111101010011011010011 K16=11110001101111100010111000000001S盒中,16次运算时,每次的8 个结果为:第一次:5,11,4,1,0,3,13,9;第二次:7,13,15,8,12,12,13,1;第三次:8,0,0,4,8,1,9,12;第四次:0,7,4,1,7,6,12,4;第五次:8,1,0,11,5,0,14,14;第六次:14,12,13,2,7,15,14,10;第七次:12,15,15,1,9,14,0,4;第八次:15,8,8,3,2,3,14,5

23、;第九次:8,14,5,2,1,15,5,12;第十次:2,8,13,1,9,2,10,2;第十一次:10,15,8,2,1,12,12,3;第十二次:5,4,4,0,14,10,7,4;第十三次:2,13,10,9,2,4,3,13;第十四次:13,7,14,9,15,0,1,3;第十五次:3,1,15,5,11,9,11,4;第十六次:12,3,4,6,9,3,3,0;子密钥生成过程中,生成的数值为:C0=0000000011111111111111111011 D0=1000001101110110000001101000C1=0000000111111111111111110110 D1=0000011011101100000011010001C2=0000001111111111111111101100 D2=0000110111011000000110100010C3=0000111111111111111110110000 D3=0011011101100000011010001000C4=0011111111111111111011000000 D4=1101110110000001101000100000C5=1111111

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论