在通信网络的两端

源代码在线查看: des加密算法(c++实现).txt

软件大小: 5 K
上传用户: junglili
关键词: 通信网络
下载地址: 免注册下载 普通下载 VIP

相关代码

				这是我在做网络安全课程设计时做的,用C++写的DES加密算法,由于水平有限,请大家多多指教!
				 代码如下:
				#include
				class SubKey{                       //定义子密钥为一个类
				public:
				 int key[8][6];
				}subkey[16];                        //定义子密钥对象数组
				
				class DES{
				 int encipher_decipher;                //判断加密还是解密
				 int key_in[8][8];                     //用户原始输入的64位二进制数
				 int key_out[8][7];                    //除去每行的最后一位校验位
				 int c0_d0[8][7];                      //存储经PC-1转换后的56位数据
				 int c0[4][7],d0[4][7];                //分别存储c0,d0
				    int text[8][8];                       //64位明文
				 int text_ip[8][8];                    //经IP转换过后的明文 
				 int A[4][8],B[4][8];                  //A,B分别存储经IP转换过后明文的两部分,便于交换
				 int temp[8][6];                       //存储经扩展置换后的48位二进制值
				 int temp1[8][6];                      //存储和子密钥异或后的结果
				 int s_result[8][4];                   //存储经S变换后的32位值
				 int text_p[8][4];                     //经P置换后的32位结果
				 int secret_ip[8][8];                  //经逆IP转换后的密文
				public:
				 void Key_Putting();
				 void PC_1();
				 int function(int,int);    //异或
				 void SubKey_Production();
				    void IP_Convert();
				 void f();        
				 void _IP_Convert();              
				 void Out_secret();
				};
				void DES::Key_Putting()           //得到密钥中对算法有用的56位
				{
				 cout				 for(int i=0;i				  for(int j=0;j				   cin>>key_in[i][j];
				   if(j!=7) key_out[i][j]=key_in[i][j];
				  }
				}
				void DES::PC_1()                       //PC-1置换函数
				{
				 int pc_1[8][7]={                          //PC-1
				  {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 i,j;
				 for(i=0;i				  for(j=0;j				   c0_d0[i][j]=key_out[ (pc_1[i][j]-1)/8 ][ (pc_1[i][j]-1)%8 ];
				}
				int DES::function(int a,int b)    //模拟二进制数的异或运算,a和b为整型的0和1,返回值为整型的0或1
				{
				 if(a!=b)return 1;
				 else return 0;
				}
				void DES::SubKey_Production()            //生成子密钥
				{
				 int move[16][2]={       //循环左移的位数
				  1 , 1 , 2 , 1 ,
				  3 , 2 , 4 , 2 ,
				  5 , 2 , 6 , 2 ,
				  7 , 2 , 8 , 2 ,
				  9 , 1, 10 , 2,
				  11 , 2, 12 , 2,
				  13 , 2, 14 , 2,
				  15 , 2, 16 , 1
				 };
				 int pc_2[8][6]={                       //PC-2
				  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
				 };
				 for(int i=0;i				 {
				  int j,k;
				  int a[2],b[2];    
				  int bb[28],cc[28];
				  for(j=0;j				   for(k=0;k				    c0[j][k]=c0_d0[j][k];
				  for(j=4;j				   for(k=0;k				    d0[j-4][k]=c0_d0[j][k];
				  for(j=0;j				   for(k=0;k				    bb[7*j+k]=c0[j][k];
				    cc[7*j+k]=d0[j][k];
				   }
				  for(j=0;j				   a[j]=bb[j];
				   b[j]=cc[j];
				  }
				  for(j=0;j				   bb[j]=bb[j+1];
				   cc[j]=cc[j+1];
				  }
				  for(j=0;j				   bb[27-j]=a[j];
				   cc[27-j]=b[j];
				  }
				  for(j=0;j				   c0[j/7][j%7]=bb[j];
				   d0[j/7][j%7]=cc[j];
				  }
				  for(j=0;j				   for(k=0;k				    c0_d0[j][k]=c0[j][k];
				  for(j=4;j				   for(k=0;k				    c0_d0[j][k]=d0[j-4][k];
				  for(j=0;j				   for(k=0;k				    subkey[i].key[j][k]=c0_d0[  (pc_2[j][k]-1)/7  ][  (pc_2[j][k]-1)%7  ];
				 }
				}
				void DES::IP_Convert()
				{
				 int IP[8][8]={               //初始置换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
				 };
				 cout				 cin>>encipher_decipher;
				 char * s;
				    if(encipher_decipher==1) s="明文";
				 else  s="密文";
				 cout				 int i,j;
				 for(i=0;i				  for(j=0;j				   cin>>text[i][j];
				    for(i=0;i				  for(j=0;j				   text_ip[i][j]=text[  (IP[i][j]-1)/8  ][  (IP[i][j]-1)%8  ];
				}
				void DES::f()                      //加密
				{
				 int i,j,k;
				 int e[8][6]={        //扩展置换E
				  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]={                     //选择函数S
				 // S1 
				 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,
				 // S2 
				    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,  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,
				 // S3 
				    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,
				 // S4 
				     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,
				 // S5 
				     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,
				  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,
				 // S6 
				    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,
				 // S7 
				     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,
				 // S8 
				    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[8][4]={                      //置换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
				 };
				 int temp3[8][4];           //暂时存放与B异或的结果
				 for(k=0;k				 {
				  for(i=0;i				   for(j=0;j				    B[i][j]=text_ip[i][j];
				  for(i=4;i				   for(j=0;j				    A[i-4][j]=text_ip[i][j];
				  for(i=0;i				   for(j=0;j				    temp[i][j]=A[  (e[i][j]-1)/8  ][  (e[i][j]-1)%8  ];
				  int en_de;      //加密和解密是的值是不同的,加密是初始值等于k,解密时等于15-k
				  if(encipher_decipher==1)  en_de=k;
				  else en_de=15-k;
				  for(i=0;i				   for(j=0;j				    temp1[i][j]=function(temp[i][j],subkey[en_de].key[i][j]);//与子密钥进行异或运算
				  for(i=0;i				  {
				   int m=0,n=0;      //m,n分别表示在相应S中的行和列
				   for(j=1;j				   m=temp1[i][0]*2+temp1[i][5];
				   int temp2;
				   temp2=s[i][m][n];
				   for(j=0;j				  }
				  for(i=0;i				   for(j=0;j				    text_p[i][j]=s_result[  (p[i][j]-1)/4  ][  (p[i][j]-1)%4  ];
				   for(i=0;i				   for(j=0;j				    temp3[i][j]=function(B[ (i)/2 ][ (i%2)?(j+4):j ],text_p[i][j]);
				  if(k==15) break;
				  for(i=4;i				   for(j=0;j				    text_ip[i][j]=temp3[   (i-4)*2+j/4   ][   (j/4)?(j-4):j  ];
				  for(i=0;i				   for(j=0;j				    text_ip[i][j]=A[i][j]; 
				 }
				//下面是最后一次迭代,不交换,所以分开写
				 for(i=0;i				  for(j=0;j				   text_ip[i][j]=temp3[   i*2+j/4   ][   (j/4)?(j-4):j  ];
				 for(i=4;i				  for(j=0;j				   text_ip[i][j]=A[i-4][j];
				//到此为止最后一次处理结束
				}
				void DES::_IP_Convert()           //逆IP置换
				{
				 int _ip[8][8]={
				  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
				 };
				 int i,j;
				 for(i=0;i				  for(j=0;j				   secret_ip[i][j]=text_ip[  (_ip[i][j]-1)/8  ][  (_ip[i][j]-1)%8  ];
				}
				void DES::Out_secret()
				{
				 char *s;
				 if(encipher_decipher==1) s="加密后的密文:";
				 else s="解密后的明文:";
				 cout				 int i,j;
				 for(i=0;i				  for(j=0;j				   cout				  cout				 }
				}
				void main()
				{
				 DES coowind;
				 coowind.Key_Putting();
				 coowind.PC_1();
				 coowind.SubKey_Production();
				 coowind.IP_Convert();
				 coowind.f();
				 coowind._IP_Convert();
				 coowind.Out_secret();
				}
							

相关资源