DES加密算法C语言 实验报告
关于DES加密算法的C语言实现
信息与网络安全实验报告计算机科学与技术学院网络工程1202班郭尚秀1208020204/********DES密码的加密过程*******************1.将字母转化为二进制数(明文&密文)分成两组完成*2.对明文m进行初始IP置换完成*3.对密钥k进行密钥置换完成*4.对密钥k进行压缩置换完成*5.对R0进行扩展变换32->48 完成*6.结果和k进行异或运算完成*7.将结果分成8组,通过8个s盒完成*8.对s盒的输出序列进行P置换完成*9.对p置换的结果与L0进行异或运算完成********************************************/#include<stdio.h>int ip[] = { //IP置换58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};int jiou[] = {7,15,23,31,39,47,55,63 //进行密钥添加奇偶校验位使用};int ki[] = { //密钥置换57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4};int kyasuo[]= { //对密钥进行压缩置换14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};int mkuozhan[]= {32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};int s[8][4][16] = { //8个s盒{{14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7},{ 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8},{ 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0},{15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13}},{{15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10},{ 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5},{ 0,14, 4,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15},{13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9}},{{10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8},{13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1},{13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7},{ 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12}},{{ 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15},{13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9},{10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4},{ 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14}},{{ 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9},{14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6},{10, 6, 9, 0,12,11, 7, 8,15, 9,12, 5, 6, 3, 0,14},{11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3}},{{12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11},{10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8},{ 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6},{ 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13}},{{ 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1},{13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6},{ 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2},{ 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12}},{{13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7},{ 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2},{ 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8},{ 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11}}};int p[32] = { //最后的p置换16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25};void main(){char mingwen1[100];int mingwen2[100];int tempmingwen[100];int L0[32],R0[32];int R48[48];char miyue1[100];int miyue2[100];int tempmiyue[100];int C0[28],D0[28];int yihuo[48]; //存放R0与K1异或的结果int sheD; //存放经过s盒之后的十进制结果int sheB[8][4]; //存放经过s盒之后的二进制结果int she[32]; //对s盒中的数据进行合并,存放经过s盒的结果int hang,lie; //存放s盒的行列序号int p2[32]; //存放经过p置换后的结果int c,d; //存放C0[0]和D0[0]int i,j; //i,j作为循环使用int icount1,icount2,k;int temp;//__________________________明文输入__________________________________________________________________________________ ________________k=0;printf("请输入明文(以'#'号结尾):\n");for(i=0; i<100; i++){scanf("%c",&mingwen1[i]);if('#' == mingwen1[i]){icount1 = i;goto loop1;}}loop1:for(i=0;i<=icount1;i++){for(j=7;j>=0;j--){temp=mingwen1[i]&(1<<j);if(0 == temp){mingwen2[k]=0;k++;}else{mingwen2[k]=1;k++;}}}//_________________________密钥输入__________________________________________________________________________________ _________________k=0;fflush(stdin); //清除缓冲区内的数据,如果不加上,则miwen[0]会多出一个LF(换行符)!!!printf("请输入密钥(以'#'号结束):\n");for(i=0; i<100; i++){scanf("%c",&miyue1[i]);if('#' == miyue1[i]){icount2 = i;goto loop2;}}loop2:for(i=0;i<=icount2;i++){for(j=7;j>=0;j--){temp=miyue1[i]&(1<<j);if(0 == temp){miyue2[k]=0;k++;}else{miyue2[k]=1;k++;}}}//**********************************************************printf("\n\nm = ");for(i=0;i<8*icount1;i++){printf("%d",mingwen2[i]);if(i== 7||i==15||i==23||i==39||i==47||i==55||i==63){printf(" ");}if(i==31){printf("\n");printf(" ");}}printf("\nk = ");for(i=0;i<8*icount2;i++){printf("%d",miyue2[i]);if(i== 7||i==15||i==23||i==39||i==47||i==55||i==63){printf(" ");}if(i==31){printf("\n");printf(" ");}}printf("\n");//**********************************************************///____________________至此二进制的明文存放在mingwen2[]中_____________________________________________________________________________//________________________进行明文的初始置换IP________________________________________________________________________________ _________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<8*icount1;i++){tempmingwen[i] = mingwen2[ip[i]-1];}//________________________置换IP后的结果存放在tempmingwen[i]中__________________________________________________________________________//________________________把明文结果存放到L0和R0中__________________________________________________________________________________ ____fflush(stdin); //清除缓冲区内的数据for(i=0;i<64;i++){if(i<32) {L0[i]=tempmingwen[i];}else {R0[i-32]=tempmingwen[i];}}//**************************************printf("\nm经过IP置换后得到:\n");printf("L0: ");for(i=0;i<32;i++){printf("%d",L0[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}printf("\nR0: ");for(i=0;i<32;i++){printf("%d",R0[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}printf("\n");//**************************************///_______________________对密文进行添加奇偶校验位__________________________________________________________________________________ _____fflush(stdin); //清除缓冲区内的数据for(i=0;i<8;i++){j=56+i;while(j>=jiou[i]){miyue2[j+1]=miyue2[j];j--;}if(i==0 || i==2 || i==4 || i==6) {miyue2[jiou[i]]=0;}else {miyue2[jiou[i]]=1;}}/**********************************************************for(i=0;i<64;i++){printf("%d",miyue2[i]);if(i== 7||i==15||i==23||i==31||i==39||i==47||i==55||i==63){printf(" ");}}**********************************************************///_________________________对密文进行密钥置换__________________________________________________________________________________ _________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<56;i++){tempmiyue[i]=miyue2[ki[i]-1];}/*********************************printf("\n\n");for(i=0;i<56;i++){printf("%d",tempmiyue[i]);if(i== 7||i==15||i==23||i==31||i==39||i==47||i==55||i==63){printf(" ");}}*********************************/fflush(stdin); //清除缓冲区内的数据for(i=0;i<56;i++){if(i<28) {C0[i]=tempmiyue[i];}else {D0[i-28]=tempmiyue[i];}}//**************************************printf("\n密钥k经过置换后得到:");printf("\nC0: ");for(i=0;i<28;i++)printf("%d",C0[i]);if(i== 7||i==15||i==23){printf(" ");}}printf("\nR0: ");for(i=0;i<28;i++){printf("%d",D0[i]);if(i== 7||i==15||i==23){printf(" ");}}printf("\n");//**************************************///_________________________分别对C0和D0进行循环左移操作__________________________________________________________________________________ __c = C0[0];d = D0[0];for(i=0;i<27;i++){C0[i] = C0[i+1];}C0[28] = c;for(i=0;i<27;i++){D0[i] = D0[i+1];}D0[28] = d;//__________________________对C0和D0进行合并存入miyue2[]中______________________________________________________________________________ fflush(stdin); //清除缓冲区内的数据for(i=0;i<56;i++){if(i<28) {miyue2[i]=C0[i];}else {miyue2[i]=D0[i-28];}}//_________________________________________________________________________________ _____-fflush(stdin); //清除缓冲区内的数据for(i=0;i<48;i++){tempmiyue[i] = miyue2[kyasuo[i]-1];}//**************************************printf("\n循环左移一位后经过密钥置换得到48位子密钥:\n");for(i=0;i<48;i++){printf("%d",tempmiyue[i]);if(i== 7||i==15||i==31||i==39||i==47){printf(" ");}if(i==23){printf("\n");}//**************************************/fflush(stdin); //清除缓冲区内的数据for(i=0;i<48;i++){R48[i]=R0[mkuozhan[i]-1];}//***************************************printf("\n\nR0经过扩展变换得到的48位序列为:\n");for(i=0;i<48;i++){printf("%d",R48[i]);if(i== 7||i==15||i==31||i==39||i==47){printf(" ");}if(i==23){printf("\n");}}//**************************************///______________________R0与K1异或______________________________________________________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<48;i++){yihuo[i] = R48[i]^tempmiyue[i];}//______________________结果存放到yihuo[]数组中_________________________________________________//***************************************printf("\n\n结果再和k1进行异或运算,得到的结果为:\n");for(i=0;i<48;i++){printf("%d",yihuo[i]);if(i== 7||i==15||i==31||i==39||i==47){printf(" ");}if(i==23){printf("\n");}}//**************************************///_______________________通过8个s盒的到32位的序列_______________________________________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<8;i++){k=0; //清除k的值hang=yihuo[(1+(i*6))-1]*2 + yihuo[(6+(i*6))-1];lie =yihuo[(2+(i*6))-1]*8 + yihuo[(3+(i*6))-1]*4 + yihuo[(4+(i*6))-1]*2 + yihuo[(5+(i*6))-1];sheD=s[i][hang][lie];for(j=3;j>=0;j--){temp=sheD&(1<<j);if(0 == temp){sheB[i][k]=0;k++;}else{sheB[i][k]=1;k++;}}}//______________________将二维数组sheB[][]中的内容转存到一维数组she中,方便以后的计算___________fflush(stdin); //清除缓冲区内的数据k=0;for(i=0;i<8;i++){for(j=0;j<4;j++){she[k]=sheB[i][j];k++;}}//*************************************printf("\n\n通过8个s盒得到32位的序列为:\n");for(i=0;i<32;i++){printf("%d",she[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}printf("\n");//*************************************///______________________对s盒的输出序列进行p置换__________________________________________________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<32;i++){p2[i]=she[p[i]-1];}//*************************************fflush(stdin); //清除缓冲区内的数据printf("\n对s盒的输出序列进行p置换,得到\n");for(i=0;i<32;i++){printf("%d",p2[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}//*************************************///______________________p置换之后和L0进行异或运算_______________________________________________________________________________fflush(stdin); //清除缓冲区内的数据for(i=0;i<32;i++){p2[i]=L0[i]^p2[i];}//______________________L0和R0交换__________________________________________________________________________________ ______________________for(i=0;i<32;i++){L0[i]=R0[i];R0[i]=p2[i];}//*************************************printf("\n\n经过以上操作,得到进过第一轮加密的结果序列为:\n");printf("L0: ");for(i=0;i<32;i++){printf("%d",L0[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}printf("\n");printf("R0: ");for(i=0;i<32;i++){printf("%d",R0[i]);if(i== 7||i==15||i==23||i==31){printf(" ");}}printf("\n");}。
DES加密算法的简单实现实验报告
DES加密算法的简单实现实验报告一、实验目的本实验的主要目的是对DES加密算法进行简单的实现,并通过实际运行案例来验证算法的正确性和可靠性。
通过该实验可以让学生进一步了解DES算法的工作原理和加密过程,并培养学生对算法实现和数据处理的能力。
二、实验原理DES(Data Encryption Standard,数据加密标准)是一种对称密钥加密算法,它是美国联邦政府采用的一种加密标准。
DES算法使用了一个共享的对称密钥(也称为密钥),用于加密和解密数据。
它采用了分组密码的方式,在进行加密和解密操作时,需要将数据分成固定长度的数据块,并使用密钥对数据进行加密和解密。
DES算法主要由四个步骤组成:初始置换(Initial Permutation),轮函数(Round Function),轮置换(Round Permutation)和最终置换(Final Permutation)。
其中初始置换和最终置换是固定的置换过程,用于改变数据的顺序和排列方式。
轮函数是DES算法的核心部分,它使用了密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
通过多轮的迭代运算,DES算法可以通过一个给定的密钥对数据进行高强度的加密和解密操作。
三、实验步骤2.初始置换:将输入数据按照一定的规则重新排列,生成一个新的数据块。
初始置换的规则通过查表的方式给出,我们可以根据规则生成初始置换的代码。
3.轮函数:轮函数是DES算法的核心部分,它使用轮密钥和数据块作为输入,并生成一个与数据块长度相同的输出结果。
在实际的算法设计和实现中,可以使用混合逻辑电路等方式来实现轮函数。
4.轮置换:轮置换将轮函数的输出结果与前一轮的结果进行异或操作,从而改变数据的排列方式。
轮置换的规则也可以通过查表的方式给出。
5.最终置换:最终置换与初始置换类似,将最后一轮的结果重新排列,生成最终的加密结果。
des算法实验报告
des算法实验报告DES算法实验报告一、引言数据加密标准(Data Encryption Standard,简称DES)是一种对称密钥加密算法,由IBM公司于1975年研发并被美国国家标准局(NBS)采纳为联邦信息处理标准(FIPS)。
二、算法原理DES算法采用了分组密码的方式,将明文数据划分为固定长度的数据块(64位),并通过密钥进行加密和解密操作。
其核心是Feistel结构,每轮加密操作包括置换和替代两个步骤。
1. 置换步骤DES算法的初始置换(IP)和逆初始置换(IP-1)通过一系列的位重排操作,将输入的64位明文数据打乱,以增加加密的强度。
2. 替代步骤DES算法中使用了8个S盒(Substitution Box),每个S盒接受6位输入,并输出4位结果。
S盒的作用是将输入的6位数据映射为4位输出,通过这种非线性的映射关系,增加了算法的安全性。
3. 轮函数DES算法的加密过程包含16轮迭代,每轮迭代中都会对数据进行一系列的位重排和替代操作。
其中,轮函数是DES算法的核心部分,它通过使用子密钥对数据进行异或操作,并通过S盒替代和P盒置换操作,产生新的数据块。
三、实验步骤为了更好地理解DES算法的加密过程,我们进行了以下实验步骤:1. 输入明文和密钥我们选择了一个64位的明文数据块和一个56位的密钥作为输入。
明文数据块经过初始置换(IP)后,得到L0和R0两个32位的数据块。
2. 生成子密钥通过对密钥进行置换和循环左移操作,生成16个48位的子密钥。
3. 迭代加密对明文数据块进行16轮的迭代加密,每轮加密包括以下步骤:a. 将R(i-1)作为输入,经过扩展置换(E-box),得到48位的扩展数据。
b. 将扩展数据和子密钥Ki进行异或操作,得到48位的异或结果。
c. 将异或结果分为8个6位的数据块,分别经过8个S盒替代操作,得到32位的S盒替代结果。
d. 将S盒替代结果经过P盒置换,得到32位的轮函数输出。
des加密算法实验报告
DES加密算法实验报告1. 引言DES(Data Encryption Standard)是一种对称密码算法,于1977年被美国联邦信息处理标准(FIPS)确定为联邦标准。
DES加密算法采用分组密码的思想,将明文按照64位分为一组,经过一系列的置换、替代和迭代操作,最终输出加密后的密文。
本实验旨在通过对DES加密算法的实际操作,深入理解DES的工作原理和加密过程。
2. 实验步骤2.1. 密钥生成DES加密算法的核心在于密钥的生成。
密钥生成过程如下:1.将64位的初始密钥根据置换表进行置换,生成56位密钥。
2.将56位密钥分为两个28位的子密钥。
3.对两个子密钥进行循环左移操作,得到循环左移后的子密钥。
4.将两个循环左移后的子密钥合并,并根据压缩置换表生成48位的轮密钥。
2.2. 加密过程加密过程如下:1.将64位的明文按照初始置换表进行置换,得到置换后的明文。
2.将置换后的明文分为左右两部分L0和R0,每部分32位。
3.进行16轮迭代操作,每轮操作包括以下步骤:–将R(i-1)作为输入,经过扩展置换表扩展为48位。
–将扩展后的48位数据与轮密钥Ki进行异或操作。
–将异或结果按照S盒进行替代操作,得到替代后的32位数据。
–对替代后的32位数据进行置换,得到置换后的32位数据。
–将置换后的32位数据与L(i-1)进行异或操作,得到Ri。
–将R(i-1)赋值给L(i)。
4.将最后一轮迭代后得到的数据合并为64位数据。
5.对合并后的64位数据进行逆置换,得到加密后的64位密文。
3. 实验结果对于给定的明文和密钥,进行DES加密实验,得到加密后的密文如下:明文:0x0123456789ABCDEF 密钥:0x133457799BBCDFF1密文:0x85E813540F0AB4054. 结论本实验通过对DES加密算法的实际操作,深入理解了DES加密算法的工作原理和加密过程。
DES加密算法通过对明文的置换、替代和迭代操作,混淆了明文的结构,使得密文的产生与密钥相关。
【精品】DES算法实验报告
【精品】DES算法实验报告一、理论部分DES算法是一种对称加密算法,也是目前广泛应用的加密算法之一。
DES算法使用的是分组加密的思想,将明文数据分成一定长度的数据块,按照一定的算法进行加密,得到密文数据。
DES算法中的关键是密钥,只有持有正确密钥的人才能解密。
DES算法的密钥长度为64位,但由于存在弱密钥的问题,使用时需要特别注意。
DES算法的加密过程包括以下几个步骤:1、密钥的生成和处理:DES算法的密钥长度为64位,但由于存在弱密钥的问题,使用时需要使用程序进行特殊处理,以确保生成的密钥不为弱密钥。
2、初始置换(IP):将明文数据按照一定的规则进行置换,得到置换后的数据。
3、分组:将置换后的明文数据分成左半部分和右半部分。
4、轮函数(f函数):将右半部分进行扩展置换、异或运算、S盒代替、置换等操作,得到一个新的右半部分。
5、轮秘钥生成:生成本轮加密所需要的秘钥。
6、异或运算:将左半部分和右半部分进行异或运算,得到一个新的左半部分。
7、左右交换:将左右部分进行交换。
以上步骤循环执行16次,直到得到最终的密文数据。
二、实验部分本次实验使用C语言实现了DES算法的加密和解密过程。
具体实现过程包括以下几个部分:1、密钥的生成:使用DES算法生成64位密钥,其中包括了对弱密钥的处理。
2、置换:使用DES算法中的IP置换和IP逆置换进行数据置换。
3、轮函数:使用DES算法中的f函数进行一轮加密操作。
5、加密:循环执行16轮加密操作,得到密文数据。
以上实现过程全部基于DES算法的规范。
三、结果分析1、速度慢:由于DES算法采用的是分组加密的思想,需要执行多次操作才能得到最终结果。
因此本次实验的加密和解密速度相对较慢。
2、代码简单:本次实验的代码相对简单,只需要用到一些基本数据结构和算法即可实现DES算法的加密和解密过程。
但需要注意的是,由于DES算法本身的复杂性,代码实现中需要注意细节和边界问题。
四、总结本次实验使用C语言实现了DES算法的加密和解密过程,通过实验得到了一些结果。
DES密码算法综合实验报告
实
验
过
程
实验代码如下:
#include <iostream>
#include <fstream>
using namespace std;
FILE *file;
const static char rar[] = {
14, 17, 11, 24, 1, 5,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
35, 3, 43, 11, 51, 19, 59, 27,
34, 2, 42, 10, 50, 18, 58, 26,
33, 1, 41, 9, 49, 17, 57, 25 };
bool key[16][48]={0},/*rekey[16][48],*/
char key_in[8];
void ByteToBit(bool *Out,char *In,int bits)
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2; }
DES加密实验报告
DES加密实验报告实验目的:1.了解DES加密算法的原理和流程;2.掌握DES加密算法的编程实现方法;3.探究不同密钥长度对DES加密效果的影响。
实验设备和材料:1.计算机;2. Python编程环境。
实验步骤:1.DES加密算法原理和流程:DES(Data Encryption Standard)是一种对称加密算法,采用分组密码体制,密钥长度为56位,数据块长度为64位。
DES加密算法的流程如下:a)初始置换(IP置换):将明文分为左右两个32位的子块,并经过初始置换表IP进行置换;b)迭代加密:将初始置换结果分为左右两个子块,进行16轮迭代操作;c)轮函数:每轮迭代中,右子块与扩展置换表进行扩展置换,并与轮密钥进行异或运算,然后经过S盒替换、P置换和异或运算得到新的右子块;d)逆初始置换(IP逆置换):将最后一轮的结果进行逆初始置换,得到密文。
2.DES加密算法编程实现:首先,导入`pycrypto`库并生成合适长度的密钥;其次,定义初始置换表IP,扩展置换表E,S盒置换表S1-S8,P置换表P,以及逆初始置换表IP_inverse;然后,定义`des_encrypt`函数实现DES加密算法的逻辑:a)根据IP置换表对输入明文进行初始置换;b)将初始置换结果分为左右两个子块;c)进行16轮迭代操作,每轮迭代中更新左右子块的值;d)对最后一轮迭代结果进行逆初始置换;e)返回加密后的密文。
3.探究不同密钥长度对DES加密效果的影响:初始化明文和密钥,调用`des_encrypt`函数进行加密,并输出加密结果;分别改变密钥长度为56位、64位、128位,再次进行加密操作,并输出加密结果;比较不同密钥长度下的加密结果,进行效果分析。
实验结果:使用DES加密算法对明文进行加密,得到相应的密文。
实验结论:1.DES加密算法可以对密文进行可靠保护,提高数据的安全性;2.较长的密钥长度有助于增强DES加密算法的安全性,但同时也会增加加密和解密的运算成本;3.在实际应用中,根据需求和实际情况,选择合适的密钥长度,平衡安全性和性能的需求。
DES实验报告
DES
[实验目的] C语言实现des加密解密
[实验原理]
1.DES的加密过程: 第一阶段:初始置换IP。在第一轮迭代之前,需要加密的64位明文首先通过初始置换IP 的作用,对输 入分组实施置换。最后,按照置换顺序,DES将64位的置换结果分为左右两部分,第1位到第32位记为 L0,第33位到第64位记为R0。 第二阶段:16次迭代变换。DES采用了典型的Feistel结构,是一个乘积结构的迭代密码算法。其算法的 核心是算法所规定的16次迭代变换。DES算法的16才迭代变换具有相同的结构,每一次迭代变换都以前 一次迭代变换的结果和用户密钥扩展得到的子密钥Ki作为输入;每一次迭代变换只变换了一半数据,它 们将输入数据的右半部分经过函数f后将其输出,与输入数据的左半部分进行异或运算,并将得到的结果 作为新的有半部分,原来的有半部分变成了新的左半部分。用下面的规则来表示这一过程(假设第i次迭 代所得到的结果为LiRi): Li = Ri-1; Ri = Li-1⊕ f(Ri-1,Ki);在最后一轮左与右半部分并未变换,而是直接 将R16 L16并在一起作为未置换的输入。 第三阶段:逆(初始)置换。 他是初始置换IP的逆置换,记为IP-1。在对16次迭代的结果(R16 L16) 再使用逆置换IP-1后,得到的结果即可作为DES加密的密文Y输出,即Y = IP-1 (R16 L16)。 2.DES解密过程: DES的解密算法与其加密算法使用的算法过程相同。两者的不同之处在于解密时子密钥Ki的使用顺序与 加密时相反,如果子密钥为K1K2… K16,那么解密时子密钥的使用顺序为K16K15… K1,即使用DES解密 算法进行解密时,将以64位密文作为输入,第1次迭代运算使用子密钥K16,第2次迭代运算使用子密钥 K15,… … ,第16 次迭代使用子密钥K1,其它的运算与加密算法相同。这样,最后输出的是64位明文。
des密码算法实验c语言
des密码算法实验c语言以下是一个使用C语言实现DES密码算法的简单实验示例:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <openssl/des.h>int main() {// 输入明文char plaintext[8] = "12345678";// 初始化DES密钥DES_cblock key = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};DES_key_schedule keysched;DES_set_key_unchecked(&key, &keysched);// 加密unsigned char ciphertext[8];DES_cblock ivec = {0}; // 初始化向量DES_ncbc_encrypt(plaintext, ciphertext, sizeof(plaintext),&keysched, &ivec, DES_ENCRYPT);// 输出密文printf("Ciphertext: ");for (int i = 0; i < sizeof(plaintext); i++) {printf("%02X", ciphertext[i]);}printf("\n");// 解密unsigned char decryptedtext[8];memset(ivec, 0, sizeof(ivec)); // 重置初始化向量DES_ncbc_encrypt(ciphertext, decryptedtext, sizeof(plaintext), &keysched, &ivec, DES_DECRYPT);// 输出明文printf("Plaintext: ");for (int i = 0; i < sizeof(plaintext); i++) {printf("%c", decryptedtext[i]);}printf("\n");return 0;}```在这个实验中,我们使用了OpenSSL库中的DES函数来实现DES 密码算法。
加解密实验报告
一、实验模块1. 实验名称:加解密实验2. 实验目的:掌握基本的加密和解密方法,理解加密算法的工作原理,并能够使用C语言实现加解密功能。
3. 实验环境:Windows操作系统,C语言编译器(如Visual Studio)二、实验标题加解密实验:基于RSA算法和DES算法的加密与解密三、实验内容概述本次实验主要涉及两种加密算法:RSA算法和DES算法。
通过学习这两种算法的原理,使用C语言实现加解密功能,并验证加密和解密过程是否正确。
四、实验日期、实验操作者实验日期:2023年10月15日实验操作者:张三五、实验目的1. 理解RSA算法和DES算法的原理。
2. 使用C语言实现RSA算法和DES算法的加解密功能。
3. 验证加密和解密过程是否正确。
六、实验步骤1. RSA算法原理及实现(1)生成密钥对:使用C语言实现RSA算法的密钥生成过程,生成公钥和私钥。
(2)加密过程:使用公钥对明文进行加密,得到密文。
(3)解密过程:使用私钥对密文进行解密,得到明文。
2. DES算法原理及实现(1)密钥生成:生成DES算法的密钥,通常为56位。
(2)加密过程:使用DES算法对明文进行加密,得到密文。
(3)解密过程:使用DES算法对密文进行解密,得到明文。
3. 验证加密和解密过程(1)选择一段明文,分别使用RSA算法和DES算法进行加密,记录密文。
(2)使用相应的私钥或密钥对密文进行解密,得到明文。
(3)比较加密后的密文和解密后的明文,验证加密和解密过程是否正确。
七、实验环境1. 操作系统:Windows 102. 编译器:Visual Studio 20193. 编程语言:C语言八、实验过程1. RSA算法实验(1)生成密钥对```c#include <stdio.h>#include <stdlib.h>// RSA算法生成密钥对void generateKeys(int n, int e, int d, int p, int q) {// 初始化公钥和私钥p = 61;q = 53;n = p q;e = 17;// 计算私钥d = 2753;}int main() {int p, q, n, e, d;generateKeys(&p, &e, &d, &q, &n);printf("Public Key: (%d, %d)\n", n, e); printf("Private Key: (%d, %d)\n", n, d); return 0;}```(2)加密过程```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}int main() {int m, n, e, c;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);return 0;}```(3)解密过程```c// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int c, n, d, m;printf("Enter the encrypted message: "); scanf("%d", &c);printf("Private Key: (%d, %d)\n", n, d); m = decrypt(c, n, d);printf("Decrypted Message: %d\n", m);return 0;}```2. DES算法实验(1)密钥生成```c#include <stdio.h>// DES算法密钥生成void generateDESKey(char key, char desKey) {// 将密钥转换为DES密钥for (int i = 0; i < 56; i++) {desKey[i] = key[i / 8] & (1 << (7 - (i % 8))); }}int main() {char key[8];char desKey[56];printf("Enter the DES key: ");scanf("%s", key);generateDESKey(key, desKey);printf("DES Key: ");for (int i = 0; i < 56; i++) {printf("%02x", desKey[i]);}printf("\n");return 0;}```(2)加密过程```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);return 0;}```(3)解密过程```c#include <stdio.h>// DES算法解密void decryptDES(char input, char key, char output) { // 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the encrypted message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);decryptDES(input, key, output);printf("Decrypted Message: %s\n", output);return 0;}```3. 验证加密和解密过程(1)RSA算法验证```c#include <stdio.h>#include <math.h>// RSA算法加密int encrypt(int m, int n, int e) {int c = pow(m, e) % n;return c;}// RSA算法解密int decrypt(int c, int n, int d) {int m = pow(c, d) % n;return m;}int main() {int m, n, e, d, c, m2;printf("Enter the message: ");scanf("%d", &m);printf("Public Key: (%d, %d)\n", n, e);c = encrypt(m, n, e);printf("Encrypted Message: %d\n", c);printf("Enter the Private Key: (%d, %d)\n", n, d); m2 = decrypt(c, n, d);printf("Decrypted Message: %d\n", m2);if (m == m2) {printf("Encryption and Decryption are successful!\n"); } else {printf("Encryption and Decryption failed!\n");}return 0;}```(2)DES算法验证```c#include <stdio.h>// DES算法加密void encryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行加密// 此处省略加密算法的具体实现}// DES算法解密void decryptDES(char input, char key, char output) {// 使用DES算法对输入数据进行解密// 此处省略解密算法的具体实现}int main() {char input[64];char key[8];char output[64];printf("Enter the message: ");scanf("%s", input);printf("DES Key: ");scanf("%s", key);encryptDES(input, key, output);printf("Encrypted Message: %s\n", output);decryptDES(output, key, input);printf("Decrypted Message: %s\n", input);if (strcmp(input, "Hello") == 0) {printf("Encryption and Decryption are successful!\n");} else {printf("Encryption and Decryption failed!\n");}return 0;}```九、实验结论通过本次实验,我们掌握了RSA算法和DES算法的原理,并使用C语言实现了加解密功能。
DES_加密解密算法C实现--实验报告des算法实验
DES_加密解密算法C实现--实验报告des算法实验.....1实验一1、实验题目利用C/C++编程实现DES加密算法或MD5加密算法。
我选择的是用C++语言实现DES的加密算法。
2、实验目的通过编码实现DES算法或MD5算法,深入掌握算法的加密原理,理解其实际应用价值,同时要求用C/C++语言实现该算法,让我们从底层开始熟悉该算法的实现过程3、实验环境操作系统:WIN7旗舰版开发工具:VisualStudio2022旗舰版开发语言:C++4、实验原理DES加密流程2如上图所示为DES的加密流程,其中主要包含初始置换,压缩换位1,压缩换位2,扩展置换,S盒置换,异或运算、终结置换等过程。
初始置换是按照初始置换表将64位明文重新排列次序扩展置换是将原32为数据扩展为48位数据,它主要由三个目的:1、产生与子密钥相同的长度2、提供更长的结果,使其在加密过程中可以被压缩3、产生雪崩效应,使得输入的一位将影响两个替换S盒置换是DES算法中最核心的容,在DES中,只有S盒置换是非线性的,它比DES中其他任何一步都提供更好的平安性终结置换与初始置换相对应,它们都不影响DES的平安性,主要目的是为了更容易将明文与密文数据一字节大小放入DES的f算法中DES解密流程与加密流程根本相同,只不过在进行16轮迭代元算时,将子密钥生成的K的次序倒过来进行迭代运算5、实验过程记录在对DES算法有了清晰的认识后,编码过程中我将其分为几个关键局部分别进行编码,最后将整个过程按顺序执行,即可完成DES的加密,代码的主要几个函数如下://Byte转为BitByteToBit(ElemTypech,ElemTypebit[8])//Bit转为ByteBitToByte(ElemTypebit[8],ElemType&ch)//初始置换InitialE某(ElemTypeInorder[64],ElemTypeDisorder[64])//终结置换AntiE某(ElemTypeDisorder[64])//扩展置换E某pandE某(ElemTypeRightMsg[32],ElemTypeE某pandMsg[48])//16轮迭代加密MoveLeft(ElemTypeC[28],ElemTypeD[28],ElemTypeL0[32],ElemType R0[32])3//16轮迭代解密mMoveLeft(ElemTypeC[28],ElemTypeD[28],ElemTypeL0[32],ElemTyp eR0[32])//生成48位子密钥GetCD48(ElemTypeC[28],ElemTypeD[28],ElemTypeSecret[48])//48位明文与子密钥进行异或运算某OR(ElemTypeE某pandMsg[48],ElemTypeSecret[48],ElemTypeResult[48])//S盒四位输出getSOut(ElemTypeResult[48],ElemTypeSout[32])//直接置换DirE某change(ElemTypeSout[32],ElemTypeDirOut[32])//Li与Ri 进行抑或运算某ORLR(ElemTypeDirOut[32],ElemTypeLeft[32],ElemTypeResult[32])函数执行次序和调用关系关系如下:6.源代码//DES.cpp:定义控制台应用程序的入口点。
DES加密算法C语言 实验报告
DES实验报告一、实验目的实现DES算法。
二、实验过程按照DES的算法流程设计,具体实施详见附件。
三、使用方法首先输入密钥,八位ASCII长,否则报错。
然后输入读入文件名和写入文件名,必须以ASCII编码,否则不能使用。
四、实验结果将自身cpp文件进行加密解密,前后文件完全一样。
见文件附录源代码:// 滴一欸死.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#include"table.h"/* Constant */#define ENCRYPT_LENGTH8 //length of each unit in encryption#define DECIPHER_LENGTH 4 //length of each unit in decipher#define MAX320xFFFFFFFF //mask of 32 bits/* Declaration */typedefunsignedlonglong bit64;typedefunsignedlonglong bit56;typedefunsignedlonglong bit48;typedefunsignedint bit32;typedefunsignedint bit28;/* File stream */FILE *fin, *fout;/* For debug */inlinevoid printBite(bit64num){while (num){printf("%d", num % 2);num>>= 1;}printf("\n");}/* Transfer from char to bit in Encrtption */ inline bit64 ToBit(char *in // source string);/* Transfer from char to bit in Deciphtering */ inline bit64 DeToBit(char *in // source string);/* Transfer from bit to char */inlinevoid ToBite(char *out, // out stringbit64 num // source bits);/* Permutation */inline bit64 substitute(bit64 num, // source bitsconstint *table, // Permutation tablesize_t len // bits length);/* Bit recycle loop to left */inline bit28 MoveLeft(bit28 key, // source bitsint len // bits length);/* Bit recycle loop to right */inline bit28 MoveRight(bit28 key, // source bitsint len // bits length);/* Divide bits into two parts */inlinevoid divide(bit64 num, // source bitsint len, // length of each bitsbit32 *L, // left out bitsbit32 *R // right out bits);/* S box */inline bit32 SChange(bit48 num // source bits);/* F box */inline bit32 FChange(bit32 num, // source bitsbit48 key // secret key);/* Key initialization */inlinevoid SetKey(char *in // string of key);/* Enryption */inlinevoid DES(char *message // messages to be encrypted);/* Deciphering */inlinevoid Decipher(char *message // messages to be deciphered );/* Initialization */inlinevoid init();int main(){init();system("pause");return 0;}/* Initialization */inlinevoid init(){/* Set secret key */printf("Please input your secret key (8 digits):\n");char key[10000];scanf("%s", key);if (strlen(key) != 8){printf("ERROR Key\n");return;}SetKey(key);/* Set mode Encryption or Deciphering */printf("Please input the mode (\"E\" for Encrypt, \"D\" for Decipher):\n");void (*p)(char*);int delta = 8;switch (getch()){case'E': p = DES; delta = 8; break;case'D': p = Decipher; delta = 16; break;default: printf("ERROR!\n"); return;}/* Load file */printf("Please input the path of the in file:\n");char message[10000], in[100], out[100];scanf("%s", in);printf("Please input the path of the out file:\n");scanf("%s", out);fin = freopen(in, "r", stdin);fout = freopen(out, "w", stdout);/* If success */if (!fin || !fout){printf("Error open file!\n");return;}/* Read file */while (gets_s(message)){for (int i = 0; i < strlen(message); i += delta){p(message + i);}printf("\n");}/* Close stream */fclose(stdin);fclose(stdout);fclose(fin);fclose(fout);}/* Transfer from char to bit in Encrtption */inline bit64 ToBit(char *in){/* If valid */if (!in){return 0;}/* Copy char* */char temp[8];memset(temp, ' ', 8 * sizeof(char));for (int i = 0; i < strlen(in) && i <ENCRYPT_LENGTH; i++) {temp[i] = in[i];}/* Transfer to bit */bit64 key = 0x0;for (int i = 0; i <ENCRYPT_LENGTH; i++){key |= ((bit64)temp[i] << (ENCRYPT_LENGTH * i));}return key;}/* Transfer from char to bit in Deciphtering */inline bit64 DeToBit(char *in){/* If valid */if (!in){return 0;}/* Copy char* */char temp[64 / DECIPHER_LENGTH];memset(temp, ' ', 8 * sizeof(char));for (int i = 0; i < 64 / DECIPHER_LENGTH; i++){if (in[i] >= 'A'){temp[i] = in[i] - '7';}else{if (in[i] >= '0'){temp[i] = in[i] - '0';}}}/* Transfer to bit */bit64 key = 0x0;for (int i = 0; i < 64 / DECIPHER_LENGTH; i++){key |= ((bit64)temp[i] << (DECIPHER_LENGTH * i));}return key;}/* Transfer from bit to char */inlinevoid ToBite(char *out, bit64num){if (strlen(out) <= ENCRYPT_LENGTH){out = (char*)malloc(sizeof(char) * (ENCRYPT_LENGTH + 1));}memset(out, 0, sizeof(char) * (ENCRYPT_LENGTH + 1));for (int i = 0; i <ENCRYPT_LENGTH; i++){out[i] = num& 0xFF;}}/* Permutation */inline bit64 substitute(bit64num, constint *table, size_t len) {bit64 out = 0;/* Calculation */for (int i = 0; i <len; i++){out |= ((bit64)((num>> (table[i] - 1)) & 1) << i);}return out;}/* Bit recycle loop to left */inline bit28 MoveLeft(bit28key, int len){bit28 temp = 0;temp = key<< (28 - len); // right bitskey = key>>len; // left bitskey |= temp; // comparekey&= 0x0FFFFFFF; // delete highest four bits return key;}/* Bit recycle loop to right */inline bit28 MoveRight(bit28key, int len){bit28 temp = 0;temp = key>> (28 - len); // right bitskey = key<<len; // left bitskey |= temp; // comparereturn key;}/* Divide bits into two parts */inlinevoid divide(bit64num, int len, bit32 *L, bit32 *R){*L = *R = 0;*L = num&MAX32;*R = num&MAX32;}/* S box */inline bit32 SChange(bit48num){bit32 key = 0;for (int i = 0; i < 8; i++){bit32 x, y;x = (num>> 1) & 0x0F; // the middle four bitsy = (((num>> 5) & 1) << 1) | (num& 1); // the first and the last bitskey |= (S[i][y][x] << (i * 4)); // permutatenum>>= 6; // change to next }return key;}/* F box */inline bit32 FChange(bit32num, bit48key){bit48 temp = substitute(num, E, sizeof(E) / sizeof(E[0]));temp ^= key;num = SChange(temp);return substitute(num, P, sizeof(P) / sizeof(P[0]));}/* Key initialization */inlinevoid SetKey(char *in){bit64 key = ToBit(in);bit28 C, D;key = substitute(key, PC1, sizeof(PC1) / sizeof(PC1[0]));divide(key, 28, &C, &D);for (int i = 0; i < 16; i++){C = MoveLeft(C, Move[i]);D = MoveLeft(D, Move[i]);key = (bit64)C | ((bit64)D << 28);SubKey[i] = substitute(key, PC2, 48);}}/* Enryption */inlinevoid DES(char *message){bit64 BitMes = substitute(ToBit(message), IP, sizeof(IP) / sizeof(IP[0]));bit32 L, R, temp;divide(BitMes, 32, &L, &R);/* 16 rounds */for (int i = 0; i < 16; i++){temp = R;R = FChange(R, SubKey[i]);R ^= L;L = temp;}BitMes = (bit64)L | ((bit64)R << 32);BitMes = substitute(BitMes, IPR, sizeof(IPR) / sizeof(IPR[0]));/* print encrypted message */for (int i = 0; i < 16; i++){char temp = (0xF & (BitMes >> (i * 4)));temp += (temp > 9 ? '7' : '0');printf("%c", temp);}}/* Deciphering */inlinevoid Decipher(char *message){bit64 BitMes = substitute(DeToBit(message), IP, sizeof(IP) / sizeof(IP[0]));bit32 L, R, temp;divide(BitMes, 32, &L, &R);/* 16 rounds */for (int i = 15; i >= 0; i--){temp = L;L = FChange(L, SubKey[i]);L ^= R;R = temp;}BitMes = (bit64)L | ((bit64)R << 32);BitMes = substitute(BitMes, IPR, sizeof(IPR) / sizeof(IPR[0]));/* print deciphered messages */for (int i = 0; i < 8; i++){printf("%c", (0xFF & (BitMes >> (i * 8))));}}table.h文件#pragmaonce/* IP permutation for plaintext */constint IP[64] = {58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};/* IPR permutation to print */constint IPR[64] = {40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};/*--------------------------- premutation ----------------------------*//* the expansion permutation */staticint E[48] = {32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};/* Compression permutation */staticint PC1[56] = {57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4};/* Number of key bits shifted per round */staticint Move[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };/* Compression permutation */staticint PC2[48] = {14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,51,34,33,48,44,49,39,56,34,53,46,42,50,36,29,32};/*------------- F function ---------------*//* S boxes permutation */staticint S[8][4][16] = {//S114, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13, //S215, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9, //S310, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12, //S47,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,//S52,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3, //S612, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, 10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8, 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, //S74,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, 13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6, 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12, //S813, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 };/* P boxes permutation */staticint P[32] = {16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10, 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25 };/* 16 subkey undefined */staticunsignedlonglong SubKey[16];。
用C实现DES的加密实验报告
一、实验目的1、对算法描述可进行充分理解,精确理解算法的各个步骤。
2、完成DES软件算法的详细设计。
3、用C++完成算法的设计模块。
4、编制测试代码。
二、实验内容根据DES加密标准,用C++设计编写符合DES算法思想的加密程序,并进行测试、分析,并尽量考虑程序的优化。
三、方案设计DES的总体方案如下图所示。
与其他任何一种加密方案一样,加密函数有两个输入:待加密的明文和密钥。
在这里,明文的长度必须为64bit,而密钥的长度为56bit.DES加密算法的一般描述观察上图的左边部分,可以看到明文的处理阶段经过了三个阶段。
首先64BItde明文经过了一个初始置换IP后,比特重排产生了经过置换的输入。
接下来的一个阶段是由对同一个函数进行16次循环组成的,这个函数本身既包含有置换又包含有替代函数。
最后一个循环(第16个)的输出由64Bit组成,它是输入明文和密钥的函数,这个输出的左边和右边两个部分经过交换后就得到预输出。
最后,预输出通过一个逆初始置换就生成了64bit的密文,这个置换是初始置换的逆置换。
上图的右半部分给出了54Bit密钥的使用方式,密钥首先通过一个置换函数,接着对于16个循环的每一个,都通过一个循环左移操作和一个置换草所的组合产生出一个密钥K1。
对每一个循环来说,置换函数是相同的,但由于密钥比特的重复移位,产生的子密钥并不相同。
(a)初始置换58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 36 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 7(b)逆初始置换40 8 48 16 56 24 64 3239 7 47 15 55 23 63 3138 6 46 14 54 22 62 3037 5 45 13 53 21 61 2936 4 44 12 52 20 60 2835 3 43 11 51 19 59 2734 2 42 10 50 18 58 2633 1 41 9 49 17 57 25(c)DES的S盒子的定义:S114 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7015 7 4 14 2 13 1 10 6 12 11 9 5 3 84 1 14 8 13 6 2 11 15 12 9 7 3 10 5 015 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13S215 1 8 14 6 11 3 4 9 7 2 13 12 0 5 103 134 7 15 2 8 14 12 0 1 106 9 11 50 14 7 11 10 4 13 1 5 8 12 6 9 3 2 1513 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9S3100 9 14 6 3 15 5 1 13 12 7 11 4 2 8137 0 9 3 4 6 10 2 8 5 14 12 11 15 113 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7110 13 0 6 9 8 7 4 15 14 3 11 5 2 12S4713 14 3 0 6 9 10 1 2 8 5 11 12 4 15138 11 5 6 15 0 3 4 7 2 12 1 10 14 910 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4215 0 6 10 1 13 8 9 4 5 11 12 7 2 14S52 12 4 1 7 10 11 6 8 53 15 13 0 14 914 11 2 12 4 7 13 1 5 0 15 10 3 9 8 64 2 1 11 10 13 7 8 15 9 12 56 3 0 1411 8 12 7 1 14 1 16 3 15 0 9 10 4 5 3S612 1 10 15 9 2 6 8 0 13 3 4 14 7 5 1110 15 4 2 7 12 9 5 6 1 13 14 0 11 3 89 14 15 5 2 8 12 3 7 0 4 10 1 13 11 64 3 2 12 95 15 10 11 14 1 7 5 0 8 13S74 11 2 14 15 0 8 13 3 12 9 7 5 106 113 0 1 7 4 9 1 10 14 3 5 12 2 15 8 61 4 11 13 123 7 14 10 156 8 0 5 9 26 11 13 8 1 4 107 9 5 0 15 14 2 3 12S813 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7115 13 8 10 3 7 4 12 5 6 11 0 14 9 2711 4 1 9 12 14 2 0 6 10 13 15 3 5 82 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11密钥的产生:(a)舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。
C语言实现DES算法DES加密算法实验报告
xx工程大学实验报告(2015-2016学年第一学期)报告题目:DES加密算法课程名称:密码学B任课教员:专业:学号:姓名:二O一六年一月十八日一、课程概述目的:培养学员的编程能力,理解算法原理。
要求:给出DES算法的软件实现,测试DES的加密速度。
二、设计思路使用C++语言进行编程,简化了输入输出语句。
预处理时加入了iostream包。
使用了std名字空间。
加密时程序输入的明文是8个ascii码,生成一个16个16进制数的密文。
脱密时程序输入的密文是16个16进制数,生成一个8个ascii码的明文。
加脱密所用密钥均由16个16进制数组成。
其中16进制数全部使用大写字母。
程序中大量使用了的布尔数组,一个bool型变量只占用一位存储空间,比int型、char型变量要小的多。
这降低了程序的空间复杂度。
三、采取的方案本程序是将一个由8个ascii码组成的明文分组加密,生成一个由16个16进制数组成的密文。
或将一个由16个16进制数组成的密文进行脱密,生成一个由8个ascii 码组成的明文。
所用密钥由16个16进制数组成。
本实验按照输入数据及初始置换、16圈迭代、子密钥生成和逆初始置换及输出数据四个步骤实现加密算法设计。
1、输入数据及初始置换本程序首先会提示用户输入加密脱密识别码,加密输入1,脱密输入0,将此识别码存入整形变量o。
根据o的不同值,提示用户输入8个字符(加密)或16个16进制数(脱密)。
输入的明文或密文转化为二进制数后储存到布尔型数组m[65]中。
初始置换通过函数IP完成,函数输入为原始明文m,函数将输出结果保存到布尔型数组mip[65]中。
函数思想为查表,含有一个整形变量数组ip[64],保存初始变换表IP。
将mip的第i位赋值为m的第ip[i]位。
2、子密钥生成输入16个16进制数的密钥后,将密钥保存在一个16位字符数组c中,通过ToEr函数将之变为二进制数。
ToEr函数输入为字符数组,通过switch语句逐个检查字符数组的每一位,将对应的四位二进制数存在64位布尔数组k中。
des算法的实验报告
des算法的实验报告DES算法实验报告DES(Data Encryption Standard)算法是一种对称密钥加密算法,广泛应用于信息安全领域。
本实验旨在通过实验DES算法的加密和解密过程,以及密钥长度对加密效果的影响,来深入了解DES算法的原理和应用。
实验一:加密和解密过程首先,我们使用一个明文进行加密实验。
选择一个64位的明文作为输入,同时使用一个64位的密钥进行加密。
经过DES算法加密后,得到的密文长度也为64位。
然后,我们使用相同的密钥对密文进行解密,得到原始的明文。
实验结果表明,DES算法能够对明文进行有效的加密,并且使用相同的密钥能够对密文进行解密,得到原始的明文。
这说明DES算法是一种可靠的加密算法,能够保护数据的安全性。
实验二:密钥长度对加密效果的影响在第二个实验中,我们对不同长度的密钥进行加密实验,观察加密效果的变化。
我们分别使用56位、64位和128位的密钥进行加密,然后比较不同长度密钥的加密效果。
实验结果显示,密钥长度对加密效果有显著影响。
使用128位的密钥进行加密,能够得到更加安全的密文,而使用56位的密钥进行加密,则容易受到攻击。
这表明密钥长度是影响DES算法加密效果的重要因素。
结论通过本实验,我们深入了解了DES算法的加密和解密过程,以及密钥长度对加密效果的影响。
DES算法是一种可靠的加密算法,能够有效保护数据的安全性。
同时,密钥长度对加密效果有显著影响,因此在实际应用中需要选择足够长度的密钥来保障数据的安全。
总之,DES算法在信息安全领域有着重要的应用价值,通过本实验的学习,我们对DES算法有了更深入的了解,为进一步研究和应用提供了重要的参考。
实验报告 DES加密算法的实现
实验报告DES加密算法的实现班级自动化学号:姓名:2016年11月13日星期日一、DES加密简述:DES算法是一种对称密码体制,由美国IBM公司在1972年研发。
其明文按64位进行分组,密钥长64位(包含8位校验位),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。
二、DES的实现过程首先通过初始置换表IP对明文进行置换intIP_Table[64] = { 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,56,48,40,32,24,16,8,0,58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6};第一个57就是将明文中的第57个元素,放到第1的位置,然后把明文中第49个元素放到第2的位置,以此类推。
之后将换位后的输出分为两部分L0和R0,L0是输出的左32位,R0 是右32位。
intDES_IP_Transform(char data[64]){intcnt;char temp[64];for(cnt = 0; cnt< 64; cnt++){temp[cnt] = data[IP_Table[cnt]];}memcpy(data,temp,64);return 0;}之后加密函数,将R0通过位选择函数E置换,把本身是32位的R0扩充成48位,与生成的48位子密钥对应,按位运算。
intE_Table[48] = {31, 0, 1, 2, 3, 4,3, 4, 5, 6, 7, 8,7, 8,9,10,11,12,11,12,13,14,15,16,15,16,17,18,19,20,19,20,21,22,23,24,23,24,25,26,27,28,27,28,29,30,31, 0};intDES_E_Transform(char data[48]){intcnt;char temp[48];for(cnt = 0; cnt< 48; cnt++){temp[cnt] = data[E_Table[cnt]];}memcpy(data,temp,48);return 0;}然后,将扩充完的R0和子密钥K1进行模2加运算,得到48位的一个串,把这个串从左到右分为8组,每组6个字符。
编码理论实验报告实验三加密编码——DES数据加密算法
实验名称实验三加密编码--------DES数据加密算法一、实验目的1. 了解DES加密,解密过程;2. 在Visual C++环境中运用C语言实现DES加密,解密;3. 会用DES加密方法对文件进行加密。
二、实验内容1. 在Visual C++环境中运用C语言熟练实现DES加密;2. 在Visual C++环境中运用C语言熟练实现DES解密。
三、实验原理1. DES加密的定义DES是一种分组密码,也是一种单钥密码。
2. DES的特点明文分组比较短、密钥较短、密码生命周期较短、运算速度较慢。
3. DES加密算法描述在DES中明文分组长为64比特,密钥长为56比特。
明文处理过程大致分为3个阶段,首先为一个初始置换IP,用于重排明文分组的64比特数据。
然后是相同功能的16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并被交换次序。
最后再经过一个逆初始置换(IP的逆)从而产生64比特的密文。
在上述运算中还涉及密钥的产生和运算。
4. DES解密算法描述DES的解密过程和DES的加密过程完全类似,只不过将16轮的子密钥序列K1,K2,…,K16的顺序倒过来。
即第一轮用第16个子密钥K16,第二轮用K15,以此类推。
四、实验步骤1. DES加密步骤(1)初始IP置换表2-1 初始置换IP58 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 46 38 30 22 14 664 56 48 40 32 24 16 859 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 7说明:上表元素下标从1开始,按行优先顺序排列,表中数字代表经过IP置换后,在该位置的元素对应的在原分组中元素的下标。
如:变换后第一个位置的元素为原来下标为58的元素,变换后下标为2的元素为原来下标为50的元素。
DES 加密解密算法的C完成 实验报告
美国国家标准局 1973 年开始研究除国防部外的其它部门的计算机系统的数据加密标准, 于 1973 年 5 月 15 日和 1974 年 8 月 27 日先后两次向公众发出了征求加密算法的公告。加 密算法要达到的目的通常称为 DES 密码算法要求主要为以下四点:
DES 算法的入口参数有三个:Key、Data、Mode。其中 Key 为 8 个字节共 64 位,是 DES 算法的工作密钥;Data 也为 8 个字节 64 位,是要被加密或被解密的数据;Mode 为 DES 的工作方式,有两种:加密或解密。
DES 算法是这样工作的:如 Mode 为加密,则用 Key 去把数据 Data 进行加密, 生成 Data 的密码形式(64 位)作为 DES 的输出结果;如 Mode 为解密,则用 Key 去把密码形 式的数据 Data 解密,还原为 Data 的明码形式(64 位)作为 DES 的输出结果。在通信网络 的两端,双方约定一致的 Key,在通信的源点用 Key 对核心数据进行 DES 加密,然后以密 码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样 的 Key 对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据 (如 PIN、MAC 等)在公共通信网中传输的安全性和可靠性。
目前在这里,随着三金工程尤其是金卡工程的启动,DES 算法在 POS、ATM、磁卡及 智能卡(IC 卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保 密,如信用卡持卡人的 PIN 的加密传输,IC 卡与 POS 间的双向认证、金融交易数据包的 MAC 校验等,均用到 DES 算法。
C语言DES加密算法
云南大学软件学院School of Software, Yunnan University成绩学期: 2011秋季学期课程名称: 密码技术任课教师:学生姓名:学号:实验项目: 实验二 DES加密算法联系电话:电子邮件:完成提交时间:年月日密码技术实验报告实验项目:实验二,第2题实现DES对任意文件的加解密实验要求(内容)实现DES对任意文件的加解密,利用控制台对所有文件(中英文文本、符号甚至任意的文件)的加解密。
加解密形式如下:cipher -e/-d key inputfile outputfile说明:对于加密来说,输入文件名就是明文文件,对于解密来说,输入文件名就是密文文件,注意文件读取方式和控制文件结束控制台编程:int main(int argc, char *argv[ ])实验环境操作系统:win7编译环境:Microsoft Visual Studio 2010实现功能本次实验达到了题目的要求:实现了用DES实现控制台对任意文件的加解密,用键盘接收明文(密文)文件路径和密钥,然后再输入需要保存的密文(明文)文件路径,然后就可以把加解密后得到的密明文文件保存该路径下。
程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits,然后使用标准DES的算法依次对读取的64bits明密文进出加解密处理。
主函数的操作也充分体现了程序的可操作性和健壮性,能够让用户自己选择相应的操作,比如加密、解密以及对程序的一些基本情况说明。
但是对文件的路径的输入有比较严格的格式约束。
如:盘符名:\\文件名.txt格式错误则会导致文件打开失败,不能进行加解密操作。
数据结构本次实验的程序较为复杂,涉及对位的操作。
实验过程中用到的主要数据结构为数组和文件型指针,在实验中我定义了2个文件型指针FILE *fp1,*fp2,其中一个指向明文文件,一个指向密文文件。
另外还定义了多个字符数组,如char Plainfpath[260]声明字符数组存储明文文件的文件路径,char Cipherfpath[260]声明字符数组存储密文文件的文件路径,char key[100]声明字符数组存储密钥。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DES实验报告一、实验目的实现DES算法。
二、实验过程按照DES的算法流程设计,具体实施详见附件。
三、使用方法首先输入密钥,八位ASCII长,否则报错。
然后输入读入文件名和写入文件名,必须以ASCII编码,否则不能使用。
四、实验结果将自身cpp文件进行加密解密,前后文件完全一样。
见文件附录源代码:// 滴一欸死.cpp : 定义控制台应用程序的入口点。
//#include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#include"table.h"/* Constant */#define ENCRYPT_LENGTH8 //length of each unit in encryption#define DECIPHER_LENGTH 4 //length of each unit in decipher#define MAX320xFFFFFFFF //mask of 32 bits/* Declaration */typedefunsignedlonglong bit64;typedefunsignedlonglong bit56;typedefunsignedlonglong bit48;typedefunsignedint bit32;typedefunsignedint bit28;/* File stream */FILE *fin, *fout;/* For debug */inlinevoid printBite(bit64num){while (num){printf("%d", num % 2);num>>= 1;}printf("\n");}/* Transfer from char to bit in Encrtption */ inline bit64 ToBit(char *in // source string);/* Transfer from char to bit in Deciphtering */ inline bit64 DeToBit(char *in // source string);/* Transfer from bit to char */inlinevoid ToBite(char *out, // out stringbit64 num // source bits);/* Permutation */inline bit64 substitute(bit64 num, // source bitsconstint *table, // Permutation tablesize_t len // bits length);/* Bit recycle loop to left */inline bit28 MoveLeft(bit28 key, // source bitsint len // bits length);/* Bit recycle loop to right */inline bit28 MoveRight(bit28 key, // source bitsint len // bits length);/* Divide bits into two parts */inlinevoid divide(bit64 num, // source bitsint len, // length of each bitsbit32 *L, // left out bitsbit32 *R // right out bits);/* S box */inline bit32 SChange(bit48 num // source bits);/* F box */inline bit32 FChange(bit32 num, // source bitsbit48 key // secret key);/* Key initialization */inlinevoid SetKey(char *in // string of key);/* Enryption */inlinevoid DES(char *message // messages to be encrypted);/* Deciphering */inlinevoid Decipher(char *message // messages to be deciphered );/* Initialization */inlinevoid init();int main(){init();system("pause");return 0;}/* Initialization */inlinevoid init(){/* Set secret key */printf("Please input your secret key (8 digits):\n");char key[10000];scanf("%s", key);if (strlen(key) != 8){printf("ERROR Key\n");return;}SetKey(key);/* Set mode Encryption or Deciphering */printf("Please input the mode (\"E\" for Encrypt, \"D\" for Decipher):\n");void (*p)(char*);int delta = 8;switch (getch()){case'E': p = DES; delta = 8; break;case'D': p = Decipher; delta = 16; break;default: printf("ERROR!\n"); return;}/* Load file */printf("Please input the path of the in file:\n");char message[10000], in[100], out[100];scanf("%s", in);printf("Please input the path of the out file:\n");scanf("%s", out);fin = freopen(in, "r", stdin);fout = freopen(out, "w", stdout);/* If success */if (!fin || !fout){printf("Error open file!\n");return;}/* Read file */while (gets_s(message)){for (int i = 0; i < strlen(message); i += delta){p(message + i);}printf("\n");}/* Close stream */fclose(stdin);fclose(stdout);fclose(fin);fclose(fout);}/* Transfer from char to bit in Encrtption */inline bit64 ToBit(char *in){/* If valid */if (!in){return 0;}/* Copy char* */char temp[8];memset(temp, ' ', 8 * sizeof(char));for (int i = 0; i < strlen(in) && i <ENCRYPT_LENGTH; i++) {temp[i] = in[i];}/* Transfer to bit */bit64 key = 0x0;for (int i = 0; i <ENCRYPT_LENGTH; i++){key |= ((bit64)temp[i] << (ENCRYPT_LENGTH * i));}return key;}/* Transfer from char to bit in Deciphtering */inline bit64 DeToBit(char *in){/* If valid */if (!in){return 0;}/* Copy char* */char temp[64 / DECIPHER_LENGTH];memset(temp, ' ', 8 * sizeof(char));for (int i = 0; i < 64 / DECIPHER_LENGTH; i++){if (in[i] >= 'A'){temp[i] = in[i] - '7';}else{if (in[i] >= '0'){temp[i] = in[i] - '0';}}}/* Transfer to bit */bit64 key = 0x0;for (int i = 0; i < 64 / DECIPHER_LENGTH; i++){key |= ((bit64)temp[i] << (DECIPHER_LENGTH * i));}return key;}/* Transfer from bit to char */inlinevoid ToBite(char *out, bit64num){if (strlen(out) <= ENCRYPT_LENGTH){out = (char*)malloc(sizeof(char) * (ENCRYPT_LENGTH + 1));}memset(out, 0, sizeof(char) * (ENCRYPT_LENGTH + 1));for (int i = 0; i <ENCRYPT_LENGTH; i++){out[i] = num& 0xFF;}}/* Permutation */inline bit64 substitute(bit64num, constint *table, size_t len) {bit64 out = 0;/* Calculation */for (int i = 0; i <len; i++){out |= ((bit64)((num>> (table[i] - 1)) & 1) << i);}return out;}/* Bit recycle loop to left */inline bit28 MoveLeft(bit28key, int len){bit28 temp = 0;temp = key<< (28 - len); // right bitskey = key>>len; // left bitskey |= temp; // comparekey&= 0x0FFFFFFF; // delete highest four bits return key;}/* Bit recycle loop to right */inline bit28 MoveRight(bit28key, int len){bit28 temp = 0;temp = key>> (28 - len); // right bitskey = key<<len; // left bitskey |= temp; // comparereturn key;}/* Divide bits into two parts */inlinevoid divide(bit64num, int len, bit32 *L, bit32 *R){*L = *R = 0;*L = num&MAX32;*R = num&MAX32;}/* S box */inline bit32 SChange(bit48num){bit32 key = 0;for (int i = 0; i < 8; i++){bit32 x, y;x = (num>> 1) & 0x0F; // the middle four bitsy = (((num>> 5) & 1) << 1) | (num& 1); // the first and the last bitskey |= (S[i][y][x] << (i * 4)); // permutatenum>>= 6; // change to next }return key;}/* F box */inline bit32 FChange(bit32num, bit48key){bit48 temp = substitute(num, E, sizeof(E) / sizeof(E[0]));temp ^= key;num = SChange(temp);return substitute(num, P, sizeof(P) / sizeof(P[0]));}/* Key initialization */inlinevoid SetKey(char *in){bit64 key = ToBit(in);bit28 C, D;key = substitute(key, PC1, sizeof(PC1) / sizeof(PC1[0]));divide(key, 28, &C, &D);for (int i = 0; i < 16; i++){C = MoveLeft(C, Move[i]);D = MoveLeft(D, Move[i]);key = (bit64)C | ((bit64)D << 28);SubKey[i] = substitute(key, PC2, 48);}}/* Enryption */inlinevoid DES(char *message){bit64 BitMes = substitute(ToBit(message), IP, sizeof(IP) / sizeof(IP[0]));bit32 L, R, temp;divide(BitMes, 32, &L, &R);/* 16 rounds */for (int i = 0; i < 16; i++){temp = R;R = FChange(R, SubKey[i]);R ^= L;L = temp;}BitMes = (bit64)L | ((bit64)R << 32);BitMes = substitute(BitMes, IPR, sizeof(IPR) / sizeof(IPR[0]));/* print encrypted message */for (int i = 0; i < 16; i++){char temp = (0xF & (BitMes >> (i * 4)));temp += (temp > 9 ? '7' : '0');printf("%c", temp);}}/* Deciphering */inlinevoid Decipher(char *message){bit64 BitMes = substitute(DeToBit(message), IP, sizeof(IP) / sizeof(IP[0]));bit32 L, R, temp;divide(BitMes, 32, &L, &R);/* 16 rounds */for (int i = 15; i >= 0; i--){temp = L;L = FChange(L, SubKey[i]);L ^= R;R = temp;}BitMes = (bit64)L | ((bit64)R << 32);BitMes = substitute(BitMes, IPR, sizeof(IPR) / sizeof(IPR[0]));/* print deciphered messages */for (int i = 0; i < 8; i++){printf("%c", (0xFF & (BitMes >> (i * 8))));}}table.h文件#pragmaonce/* IP permutation for plaintext */constint IP[64] = {58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7};/* IPR permutation to print */constint IPR[64] = {40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25};/*--------------------------- premutation ----------------------------*//* the expansion permutation */staticint E[48] = {32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1};/* Compression permutation */staticint PC1[56] = {57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,63,55,47,39,31,23,15, 7,62,54,46,38,30,22,14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4};/* Number of key bits shifted per round */staticint Move[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };/* Compression permutation */staticint PC2[48] = {14,17,11,24, 1, 5, 3,28,15, 6,21,10,23,19,12, 4,26, 8,16, 7,27,20,13, 2,41,52,31,37,47,55,30,40,51,34,33,48,44,49,39,56,34,53,46,42,50,36,29,32};/*------------- F function ---------------*//* S boxes permutation */staticint S[8][4][16] = {//S114, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13, //S215, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9, //S310, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12, //S47,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14,//S52,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3, //S612, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, 10,15, 4, 2, 7,12, 0, 5, 6, 1,13,14, 0,11, 3, 8, 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, //S74,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, 13, 0,11, 7, 4, 0, 1,10,14, 3, 5,12, 2,15, 8, 6, 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12, //S813, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11 };/* P boxes permutation */staticint P[32] = {16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10, 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25 };/* 16 subkey undefined */staticunsignedlonglong SubKey[16];。