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

📄 des.lst

📁 c51写的DES加解密程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 572              {0x05,0x08},	/* 27 */
 573              {0x01,0x08},	/* 28 */
 574              {0x06,0x08},	/* 29 */
 575              {0x02,0x08},	/* 30 */
 576              {0x07,0x08},	/* 31 */
 577              {0x03,0x08},	/* 32 */
 578          
 579              {0x04,0x10},	/* 33 */
 580              {0x00,0x10},	/* 34 */
 581              {0x05,0x10},	/* 35 */
 582              {0x01,0x10},	/* 36 */
 583              {0x06,0x10},	/* 37 */
 584              {0x02,0x10},	/* 38 */
 585              {0x07,0x10},	/* 39 */
 586              {0x03,0x10},	/* 40 */
 587          
 588              {0x04,0x20},	/* 41 */
 589              {0x00,0x20},	/* 42 */
 590              {0x05,0x20},	/* 43 */
 591              {0x01,0x20},	/* 44 */
 592              {0x06,0x20},	/* 45 */
 593              {0x02,0x20},	/* 46 */
 594              {0x07,0x20},	/* 47 */
 595              {0x03,0x20},	/* 48 */
 596          
 597              {0x04,0x40},	/* 49 */
 598              {0x00,0x40},	/* 50 */
 599              {0x05,0x40},	/* 51 */
 600              {0x01,0x40},	/* 52 */
 601              {0x06,0x40},	/* 53 */
 602              {0x02,0x40},	/* 54 */
 603              {0x07,0x40},	/* 55 */
 604              {0x03,0x40},	/* 56 */
 605          
 606              {0x04,0x80},	/* 57 */
 607              {0x00,0x80},	/* 58 */
 608              {0x05,0x80},	/* 59 */
 609              {0x01,0x80},	/* 60 */
 610              {0x06,0x80},	/* 61 */
 611              {0x02,0x80},	/* 62 */
 612              {0x07,0x80},	/* 63 */
 613              {0x03,0x80},	/* 64 */
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 11  

 614          };
 615          
 616          /*
 617           *   待转换的数据(明文)最开始的置换 64-bits ==> 64-bits
 618           *   转换结果由in_data[]数组继续带回去
 619           */
 620          void Data_Init_Replace(unsigned char in_data[]) {
 621   1      	unsigned char temp_data[8];
 622   1          unsigned char i,j,deal_data;
 623   1      	unsigned char index=0;
 624   1      	unsigned char NewKey_index,NewKey_data;
 625   1      
 626   1      	for (i=0;i<8;i++)
 627   1          	temp_data[i]=0;
 628   1      	for (i=0;i<8;i++) {			/* 总共8字节(64-bits) */
 629   2          	deal_data=in_data[i];		/* 取第i个字节 */
 630   2              for (j=0;j<8;j++) {
 631   3      			if ((deal_data & 0x80)==0x80) {
 632   4          			NewKey_index=Data_Init_Replace_Tab[index][0];
 633   4                      NewKey_data=Data_Init_Replace_Tab[index][1];
 634   4      				temp_data[NewKey_index] |= NewKey_data;
 635   4                  }
 636   3      			index++;
 637   3                  deal_data <<= 1;
 638   3              }
 639   2          }
 640   1          for (i=0;i<8;i++)
 641   1          	in_data[i]=temp_data[i];
 642   1      }
 643          
 644          /*
 645           //  0    40  08  48  16  56  24  64  32
 646           //  1    39  07  47  15  55  23  63  31
 647           //  2    38  06  46  14  54  22  62  30
 648           //  3    37  05  45  13  53  21  61  29
 649           //  4    36  04  44  12  52  20  60  28
 650           //  5    35  03  43  11  51  19  59  27
 651           //  6	  34  02  42  10  50  18  58  26
 652           //  7    33  01  41  09  49  17  57  25
 653           *  最后形成密文前的置换
 654           */
 655          static unsigned char Data_End_Replace_Tab[64][2]={
 656          	{0x07,0x40},	/* 1 */
 657              {0x06,0x40},	/* 2 */
 658              {0x05,0x40},	/* 3 */
 659              {0x04,0x40},	/* 4 */
 660              {0x03,0x40},	/* 5 */
 661              {0x02,0x40},	/* 6 */
 662              {0x01,0x40},	/* 7 */
 663              {0x00,0x40},	/* 8 */
 664          
 665              {0x07,0x10},	/* 9 */
 666              {0x06,0x10},	/* 10 */
 667              {0x05,0x10},	/* 11 */
 668              {0x04,0x10},	/* 12 */
 669              {0x03,0x10},	/* 13 */
 670              {0x02,0x10},	/* 14 */
 671          	{0x01,0x10},	/* 15 */
 672              {0x00,0x10},	/* 16 */
 673          
 674              {0x07,0x04},	/* 17 */
 675          	{0x06,0x04},	/* 18 */
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 12  

 676              {0x05,0x04},	/* 19 */
 677              {0x04,0x04},	/* 20 */
 678              {0x03,0x04},	/* 21 */
 679              {0x02,0x04},	/* 22 */
 680              {0x01,0x04},	/* 23 */
 681              {0x00,0x04},	/* 24 */
 682          
 683              {0x07,0x01},	/* 25 */
 684              {0x06,0x01},	/* 26 */
 685              {0x05,0x01},	/* 27 */
 686              {0x04,0x01},	/* 28 */
 687              {0x03,0x01},	/* 29 */
 688              {0x02,0x01},	/* 30 */
 689              {0x01,0x01},	/* 31 */
 690              {0x00,0x01},	/* 32 */
 691          
 692              {0x07,0x80},	/* 33 */
 693              {0x06,0x80},	/* 34 */
 694              {0x05,0x80},	/* 35 */
 695              {0x04,0x80},	/* 36 */
 696              {0x03,0x80},	/* 37 */
 697              {0x02,0x80},	/* 38 */
 698              {0x01,0x80},	/* 39 */
 699              {0x00,0x80},	/* 40 */
 700          
 701              {0x07,0x20},	/* 41 */
 702              {0x06,0x20},	/* 42 */
 703              {0x05,0x20},	/* 43 */
 704              {0x04,0x20},	/* 44 */
 705              {0x03,0x20},	/* 45 */
 706              {0x02,0x20},	/* 46 */
 707              {0x01,0x20},	/* 47 */
 708              {0x00,0x20},	/* 48 */
 709          
 710              {0x07,0x08},	/* 49 */
 711              {0x06,0x08},	/* 50 */
 712              {0x05,0x08},	/* 51 */
 713              {0x04,0x08},	/* 52 */
 714              {0x03,0x08},	/* 53 */
 715              {0x02,0x08},	/* 54 */
 716              {0x01,0x08},	/* 55 */
 717              {0x00,0x08},	/* 56 */
 718          
 719              {0x07,0x02},	/* 57 */
 720              {0x06,0x02},	/* 58 */
 721              {0x05,0x02},	/* 59 */
 722              {0x04,0x02},	/* 60 */
 723              {0x03,0x02},	/* 61 */
 724              {0x02,0x02},	/* 62 */
 725              {0x01,0x02},	/* 63 */
 726              {0x00,0x02},	/* 64 */
 727          };
 728          
 729          /*
 730           *   经过下面的转换后,密文最后形成 64-bits ==> 64-bits
 731           *   转换结果由in_data[]数组继续带回去
 732           */
 733          void Data_End_Replace(unsigned char in_data[]) {
 734   1      	unsigned char temp_data[8];
 735   1          unsigned char i,j,deal_data;
 736   1      	unsigned char index=0;
 737   1      	unsigned char NewKey_index,NewKey_data;
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 13  

 738   1      
 739   1      	for (i=0;i<8;i++)
 740   1          	temp_data[i]=0;
 741   1      	for (i=0;i<8;i++) {			/* 总共8字节(64-bits) */
 742   2          	deal_data=in_data[i];		/* 取第i个字节 */
 743   2              for (j=0;j<8;j++) {
 744   3      			if ((deal_data & 0x80)==0x80) {
 745   4          			NewKey_index=Data_End_Replace_Tab[index][0];
 746   4                      NewKey_data=Data_End_Replace_Tab[index][1];
 747   4      				temp_data[NewKey_index] |= NewKey_data;
 748   4                  }
 749   3      			index++;
 750   3                  deal_data <<= 1;
 751   3              }
 752   2          }
 753   1          for (i=0;i<8;i++)
 754   1          	in_data[i]=temp_data[i];
 755   1      }
 756          
 757          
 758          /*
 759           *  加密时每次循环密码向左移动位数表
 760           */
 761          static unsigned char EncrypKeyRotateTimesTab[]={
 762          	1,1,2,2,2,2,2,2,
 763              1,2,2,2,2,2,2,1
 764          };
 765          /*
 766           *  加密程序
 767           */
 768          extern void Encryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
 769   1      	unsigned char Key_56[7],Key_48[6];
 770   1      	unsigned char temp[8];
 771   1          char i,j;
 772   1      
 773   1          Key64_To_56(Key_64,Key_56);			/* 得到真正的56-bits密码 */
 774   1      	Data_Init_Replace(PlainTxt);		// 最开始一次置换
 775   1      	for (i=0;i<16;i++) {
 776   2      		for (j=0;j<4;j++)				/* 上层的右半部分直接作为下层的左半部 */
 777   2              	CipherTxt[j]=PlainTxt[4+j];	/* L(i)=L(i-1) */
 778   2              Data_32_To_48(PlainTxt+4,temp); /* 数据从32-bits扩展到48-bits */
 779   2              KeyRotate(Key_56,EncrypKeyRotateTimesTab[i],0);	/* rotate left */
 780   2              Key_56_To_48(Key_56,Key_48);	/* 密码压缩置换 */
 781   2              Xor_Data(temp,Key_48,6);		/* 异或6个字节 */
 782   2              S_Box_Replace(temp);			/* 48-bits ==> 32-bits */
 783   2              Data_P_Box_Replace(temp);		/* P盒置换 */
 784   2      		Xor_Data(temp,PlainTxt,4);		/* 异或4个字节 */
 785   2              if (i==15) {					/* 最后一次左右不交换 */
 786   3      			for (j=0;j<4;j++)
 787   3                  	PlainTxt[4+j]=CipherTxt[j];
 788   3                  for (j=0;j<4;j++)
 789   3                      PlainTxt[j]=temp[j];
 790   3              }
 791   2              else {
 792   3      	        for (j=0;j<4;j++)
 793   3          	    	PlainTxt[4+j]=temp[j];
 794   3              	for (j=0;j<4;j++)
 795   3              		PlainTxt[j]=CipherTxt[j];
 796   3              }
 797   2          }
 798   1      	for (i=0;i<8;i++)
 799   1          	CipherTxt[i]=PlainTxt[i];
C51 COMPILER V6.12  DES                                                                    01/17/2003 18:27:26 PAGE 14  

 800   1      	Data_End_Replace(CipherTxt);	// 最后一次置换
 801   1      }
 802          
 803          /*
 804           *  解密时每次循环密码向右移动位数表
 805           */
 806          static unsigned char DecrypKeyRotateTimesTab[]={
 807          	0,1,2,2,2,2,2,2,
 808              1,2,2,2,2,2,2,1
 809          };
 810          /*
 811           *  解密程序
 812           */
 813          extern void Decryption(unsigned char PlainTxt[],unsigned char Key_64[],unsigned char CipherTxt[]) {
 814   1      	unsigned char Key_56[7],Key_48[6];
 815   1      	unsigned char temp[8];
 816   1      	char i,j;
 817   1      
 818   1      	Key64_To_56(Key_64,Key_56);			/* 得到真正的56-bits密码 */
 819   1      	Data_Init_Replace(PlainTxt);		/* 最开始一次置换 */
 820   1      	for (i=0;i<16;i++) {
 821   2      		for (j=0;j<4;j++)				/* 上层的右半部分直接作为下层的左半部 */
 822   2              	CipherTxt[j]=PlainTxt[4+j];	/* L(i)=L(i-1) */
 823   2              Data_32_To_48(PlainTxt+4,temp);	/* 数据从32-bits扩展到48-bits */
 824   2              KeyRotate(Key_56,DecrypKeyRotateTimesTab[i],1);	/* rotate right */
 825   2              Key_56_To_48(Key_56,Key_48);	/* 密码压缩置换 */
 826   2              Xor_Data(temp,Key_48,6);		/* 异或6个字节 */
 827   2              S_Box_Replace(temp);			/* 48-bits ==> 32-bits */
 828   2              Data_P_Box_Replace(temp);		/* P盒置换 */
 829   2      		Xor_Data(temp,PlainTxt,4);		/* 异或4个字节 */
 830   2              if (i==15) {					/* 最后一次左右不交换 */
 831   3      			for (j=0;j<4;j++)
 832   3                  	PlainTxt[4+j]=CipherTxt[j];
 833   3                  for (j=0;j<4;j++)
 834   3                      PlainTxt[j]=temp[j];
 835   3              }
 836   2              else {
 837   3      	        for (j=0;j<4;j++)
 838   3          	    	PlainTxt[4+j]=temp[j];
 839   3              	for (j=0;j<4;j++)
 840   3              		PlainTxt[j]=CipherTxt[j];
 841   3              }
 842   2          }
 843   1      	for (i=0;i<8;i++)
 844   1          	CipherTxt[i]=PlainTxt[i];
 845   1      	Data_End_Replace(CipherTxt);	// 最后一次置换
 846   1      }
 847          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   3307    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1256     160
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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