⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.lst

📁 c51写的DES加解密程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 283              {0x03,0x10},	/* 37 */
 284              {0x00,0x00},
 285              {0x04,0x02},	/* 39 */
 286              {0x03,0x01},	/* 40 */
 287          
 288              {0x03,0x80},	/* 41 */
 289              {0x05,0x10},	/* 42 */
 290              {0x00,0x00},
 291          	{0x04,0x08},	/* 44 */
 292              {0x04,0x40},	/* 45 */
 293              {0x05,0x20},	/* 46 */
 294              {0x03,0x80},	/* 47 */
 295              {0x04,0x10},	/* 48 */
 296          
 297              {0x04,0x04},	/* 49 */
 298              {0x05,0x08},	/* 50 */
 299              {0x04,0x80},	/* 51 */
 300              {0x03,0x40},	/* 52 */
 301              {0x05,0x40},	/* 53 */
 302              {0x00,0x00},
 303              {0x03,0x04},	/* 55 */
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 6   

 304              {0x04,0x01}		/* 56 */
 305          };
 306          
 307          /*
 308           *  56位的密码经过分组循环后,重新组成56位密码,然后通过压缩变换获得48位的
 309           *  压缩置换密码,本函数目的就是为获得此压缩的48位密码,以便与通过S盒获得的
 310           *  数进行"OR" 运算
 311           */
 312          void Key_56_To_48(unsigned char Key_56[],unsigned char Key_48[]) {
 313   1          unsigned char i,j,deal_data;
 314   1      	unsigned char index=0;
 315   1      	unsigned char NewKey_index,NewKey_data;
 316   1      
 317   1      	for (i=0;i<6;i++)
 318   1          	Key_48[i]=0;
 319   1      	for (i=0;i<7;i++) {
 320   2          	deal_data=Key_56[i];
 321   2              for (j=0;j<8;j++) {
 322   3      			if ((deal_data & 0x80)==0x80) {
 323   4          			NewKey_index=Key_56_To_48_Tab[index][0];
 324   4                      NewKey_data=Key_56_To_48_Tab[index][1];
 325   4      				Key_48[NewKey_index] |= NewKey_data;
 326   4                  }
 327   3      			index++;
 328   3                  deal_data <<= 1;
 329   3              }
 330   2          }
 331   1      }
 332          
 333          unsigned char *SBox_Tab[]={
 334          	SBox_1,
 335          	SBox_2,
 336          	SBox_3,
 337          	SBox_4,
 338          	SBox_5,
 339          	SBox_6,
 340          	SBox_7,
 341          	SBox_8
 342          };
 343          
 344          /*
 345           *  48-bits 输进S-盒,获得32-bits的输出
 346           *  输出结果仍旧放进data[]
 347           */
 348          extern void S_Box_Replace(unsigned char in_data[]) {
 349   1      	unsigned char out_data[8],temp_data;
 350   1          unsigned char *ptr;
 351   1          char i,j,k;
 352   1      
 353   1          for (i=0;i<8;i++) {		/* 分别处理8个S-盒*/
 354   2          	temp_data=(in_data[0]>>2);
 355   2              temp_data &= 0x3f;		/* 获得即将去查表的索引值 */
 356   2              for (j=0;j<6;j++) {		/* 准备向左循环6次 */
 357   3              	for (k=0;k<5;k++) {	/* 每次循环6个bytes都要动 */
 358   4                  	in_data[k]<<=1;
 359   4                      in_data[k]|=((in_data[k+1]>>7) & 0x01);
 360   4                  }
 361   3      			in_data[5]<<=1;		/* 最后一个字节与前面的操作有区别*/
 362   3              }
 363   2              ptr=(unsigned char *)&SBox_Tab[i][0];
 364   2              //*ptr=(unsigned char *)SBox_Tab[i];		/* 指向第i个S-盒的转换表*/
 365   2      		//out_data[i]=(*ptr)[temp_data];	/* 获得转换数据 */
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 7   

 366   2      		out_data[i]=(ptr)[temp_data];	/* 获得转换数据 */
 367   2          }
 368   1      	for (i=0;i<4;i++) {
 369   2          	in_data[i]=( (out_data[2*i]<<4) | out_data[2*i+1]);
 370   2          }
 371   1      }
 372          
 373          /*
 374           //  0    32  01  02  03  04  05  04  05
 375           //  1    06  07  08  09  08  09  10  11
 376           //  2    12  13  12  13  14  15  16  17
 377           //  3    16  17  18  19  20  21  20  21
 378           //  4    22  23  24  25  24  25  26  27
 379           //  5    28  29  28  29  30  31  32  01
 380           *   ------------------------------------
 381           *   01分别在第0行及第5行存在,第0行的最后要和0x40或,第5行的最后要和0x01或
 382           */
 383          static unsigned char Data_32_To_48_Tab[32][4]={
 384          	{0x00,0x40,0x05,0x01},	/* 1 */
 385              {0x00,0x20,0x00,0x00},	/* 2 */
 386              {0x00,0x10,0x00,0x00},	/* 3 */
 387              {0x00,0x08,0x00,0x02},	/* 4 */
 388              {0x00,0x04,0x00,0x01},	/* 5 */
 389              {0x01,0x80,0x00,0x00},	/* 6 */
 390              {0x01,0x40,0x00,0x00},	/* 7 */
 391              {0x01,0x20,0x01,0x08},	/* 8 */
 392          
 393              {0x01,0x10,0x01,0x04},	/* 9 */
 394              {0x01,0x02,0x00,0x00},	/* 10 */
 395              {0x01,0x01,0x00,0x00},	/* 11 */
 396              {0x02,0x80,0x02,0x20},	/* 12 */
 397              {0x02,0x40,0x02,0x10},	/* 13 */
 398              {0x02,0x08,0x00,0x00},	/* 14 */
 399              {0x02,0x04,0x00,0x00},	/* 15 */
 400              {0x02,0x02,0x03,0x80},	/* 16 */
 401          
 402              {0x02,0x01,0x03,0x40},	/* 17 */
 403              {0x03,0x20,0x00,0x00},	/* 18 */
 404              {0x03,0x10,0x00,0x00},	/* 19 */
 405              {0x03,0x08,0x03,0x02},	/* 20 */
 406              {0x03,0x04,0x03,0x01},	/* 21 */
 407              {0x04,0x80,0x00,0x00},	/* 22 */
 408              {0x04,0x40,0x00,0x00},	/* 23 */
 409              {0x04,0x20,0x04,0x08},	/* 24 */
 410          
 411              {0x04,0x10,0x04,0x04},	/* 25 */
 412              {0x04,0x02,0x00,0x00},	/* 26 */
 413              {0x04,0x01,0x00,0x00},	/* 27 */
 414              {0x05,0x80,0x05,0x20},	/* 28 */
 415              {0x05,0x40,0x05,0x10},	/* 29 */
 416              {0x05,0x08,0x00,0x00},	/* 30 */
 417              {0x05,0x04,0x00,0x00},	/* 31 */
 418              {0x05,0x02,0x00,0x80} 	/* 32 */
 419          };
 420          /*
 421           *  将32-bits的数据扩展成48-bits的数据位准备与48-bits的密码异或
 422           *  本函数正是为了扩展的目的 : 32-bits  ==>  48-bits
 423           *  input  :  Plain_32[4]
 424           *  output :  Plain_48[6]
 425           */
 426          void Data_32_To_48(unsigned char Plain_32[],unsigned char Plain_48[]){
 427   1          unsigned char i,j,deal_data;
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 8   

 428   1      	unsigned char index=0;
 429   1      	unsigned char NewKey_index,NewKey_data;
 430   1      
 431   1      	for (i=0;i<6;i++)			/* 6个字节作为输出*/
 432   1          	Plain_48[i]=0;
 433   1      	for (i=0;i<4;i++) {			/* 总共4字节, 4*8=32 */
 434   2          	deal_data=Plain_32[i];		/* 取第i个字节 */
 435   2              for (j=0;j<8;j++) {
 436   3      			if ((deal_data & 0x80)==0x80) {
 437   4          			NewKey_index=Data_32_To_48_Tab[index][0];
 438   4                      NewKey_data=Data_32_To_48_Tab[index][1];
 439   4      				Plain_48[NewKey_index] |= NewKey_data;
 440   4      
 441   4          			NewKey_index=Data_32_To_48_Tab[index][2];
 442   4                      NewKey_data=Data_32_To_48_Tab[index][3];
 443   4      				Plain_48[NewKey_index] |= NewKey_data;
 444   4                  }
 445   3      			index++;
 446   3                  deal_data <<= 1;
 447   3              }
 448   2          }
 449   1      }
 450          /*
 451           //  0    16  07  20  21  29  12  28  17
 452           //  1    01  15  23  26  05  18  31  10
 453           //  2    02  08  24  14  32  27  03  09
 454           //  3    19  13  30  06  22  11  04  25
 455           */
 456          static unsigned char PBox_Replace_Tab[32][2]={
 457          	{0x01,0x80},	/* 1 */
 458              {0x02,0x80},	/* 2 */
 459              {0x02,0x02},	/* 3 */
 460              {0x03,0x02},	/* 4 */
 461              {0x01,0x08},	/* 5 */
 462              {0x03,0x10},	/* 6 */
 463              {0x00,0x40},	/* 7 */
 464              {0x02,0x40},	/* 8 */
 465          
 466              {0x02,0x01},	/* 9 */
 467              {0x01,0x01},	/* 10 */
 468              {0x03,0x04},	/* 11 */
 469              {0x00,0x04},	/* 12 */
 470              {0x03,0x40},	/* 13 */
 471              {0x02,0x10},	/* 14 */
 472          	{0x01,0x40},	/* 15 */
 473              {0x00,0x80},	/* 16 */
 474          
 475              {0x00,0x01},	/* 17 */
 476          	{0x01,0x04},	/* 18 */
 477              {0x03,0x80},	/* 19 */
 478              {0x00,0x20},	/* 20 */
 479              {0x00,0x10},	/* 21 */
 480              {0x03,0x08},	/* 22 */
 481              {0x01,0x20},	/* 23 */
 482              {0x02,0x20},	/* 24 */
 483          
 484              {0x03,0x01},	/* 25 */
 485              {0x01,0x10},	/* 26 */
 486              {0x02,0x04},	/* 27 */
 487              {0x00,0x02},	/* 28 */
 488              {0x00,0x08},	/* 29 */
 489              {0x03,0x20},	/* 30 */
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 9   

 490              {0x01,0x02},	/* 31 */
 491              {0x02,0x08}		/* 32 */
 492          };
 493          
 494          /*
 495           *   P-Box 置换 32-bits ==> 32-bits
 496           *   转换结果由in_data[]数组继续带回去
 497           */
 498          void Data_P_Box_Replace(unsigned char in_data[]) {
 499   1      	unsigned char temp_data[4];
 500   1          unsigned char i,j,deal_data;
 501   1      	unsigned char index=0;
 502   1      	unsigned char NewKey_index,NewKey_data;
 503   1      
 504   1      	for (i=0;i<4;i++)
 505   1          	temp_data[i]=0;
 506   1      	for (i=0;i<4;i++) {			/* 总共4字节, 4*8=32 */
 507   2          	deal_data=in_data[i];		/* 取第i个字节 */
 508   2              for (j=0;j<8;j++) {
 509   3      			if ((deal_data & 0x80)==0x80) {
 510   4          			NewKey_index=PBox_Replace_Tab[index][0];
 511   4                      NewKey_data=PBox_Replace_Tab[index][1];
 512   4      				temp_data[NewKey_index] |= NewKey_data;
 513   4                  }
 514   3      			index++;
 515   3                  deal_data <<= 1;
 516   3              }
 517   2          }
 518   1          for (i=0;i<4;i++)
 519   1          	in_data[i]=temp_data[i];
 520   1      }
 521          /*
 522           *  将数组Source1[]与Source2[]异或,结果放于Source1[]中,共操作count个字节
 523           */
 524          void Xor_Data(unsigned char Source1[],unsigned char Source2[],unsigned char count) {
 525   1      	unsigned char i;
 526   1      
 527   1          for (i=0;i<count;i++)
 528   1          	Source1[i]=Source1[i] ^ Source2[i];
 529   1      }
 530          
 531          /*
 532           //  0    58  50  42  34  26  18  10  02
 533           //  1    60  52  44  36  28  20  12  04
 534           //  2    62  54  46  38  30  22  14  06
 535           //  3    64  56  48  40  32  24  16  08
 536           //  4    57  49  41  33  25  17  09  01
 537           //  5    59  51  43  35  27  19  11  03
 538           //  6	  61  53  45  37  29  21  13  05
 539           //  7    63  55  47  39  31  23  15  07
 540           *  明文最开始的置换,即进入十六次循环之前的置换
 541           */
 542          static unsigned char Data_Init_Replace_Tab[64][2]={
 543          	{0x04,0x01},	/* 1 */
 544              {0x00,0x01},	/* 2 */
 545              {0x05,0x01},	/* 3 */
 546              {0x01,0x01},	/* 4 */
 547              {0x06,0x01},	/* 5 */
 548              {0x02,0x01},	/* 6 */
 549              {0x07,0x01},	/* 7 */
 550              {0x03,0x01},	/* 8 */
 551          
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 10  

 552              {0x04,0x02},	/* 9 */
 553              {0x00,0x02},	/* 10 */
 554              {0x05,0x02},	/* 11 */
 555              {0x01,0x02},	/* 12 */
 556              {0x06,0x02},	/* 13 */
 557              {0x02,0x02},	/* 14 */
 558          	{0x07,0x02},	/* 15 */
 559              {0x03,0x02},	/* 16 */
 560          
 561              {0x04,0x04},	/* 17 */
 562          	{0x00,0x04},	/* 18 */
 563              {0x05,0x04},	/* 19 */
 564              {0x01,0x04},	/* 20 */
 565              {0x06,0x04},	/* 21 */
 566              {0x02,0x04},	/* 22 */
 567              {0x07,0x04},	/* 23 */
 568              {0x03,0x04},	/* 24 */
 569          
 570              {0x04,0x08},	/* 25 */
 571              {0x00,0x08},	/* 26 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -