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

📄 s5linear.cpp

📁 实现《密码学导引》中
💻 CPP
字号:
#include"stdio.h"
#include"iostream.h"
#define Round 16
#define N 24

                                                                        //IP置换表
	static int   IP[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};
	                                                                   //Expand 扩展表
	static int   E[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};

                                                                                        /* INITIALIZE THE TABLES */
                                                                                        /* Table - s1 */
   static unsigned char s1[4][16] = {                                                   
    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 };

                                                                                        /* Table - s2 */
   static unsigned char s2[4][16] = {
    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 };

                                                                                        /* Table - s3 */
   static unsigned char s3[4][16] = {
    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 };

                                                                                        /* Table - s4 */
   static unsigned char s4[4][16] = {
    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 };

                                                                                        /* Table - s5 */
   static unsigned char s5[4][16] = {
    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 };

                                                                                        /* Table - s6 */
   static unsigned char s6[4][16] = {
    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 };

                                                                                        /* Table - s7 */
   static unsigned char s7[4][16] = {
    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 };

                                                                                        /* Table - s8 */
   static unsigned char s8[4][16] = {
    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 };
                                                                      //P置换表
	static int          P[32]={15,6,19,20,
	                           28,11,27,16,
							   0,14,22,25,
							   4,17,30,9,
							   1,7,23,13,
							   31,26,2,8,
							   18,12,29,5,
							   21,10,3,24};


                                                                                        /* Table - Shift */
   static unsigned char shift[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };


                                                                                        /* Table - Binary */ /* 每四位表示一个数:0-15,用于转化s盒的输出为2进制 */
   static unsigned char binary[64] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,
                                      0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1,
                                      1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1,
                                      1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 };
                                                                              //IP逆置换表
   static int           IP1[64]={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,
								 32,0,40,8,48,16,56,24};
                                                                              //密钥PC1置换表
   static int           PC1[56]={56,48,40,32,24,16, 8,
	                              0,57,49,41,33,25,17,
								  9,1,58,50,42,34,26,
								 18,10,2,59,51,43,35,
								 62,54,46,38,30,22,14,
								  6,61,53,45,37,29,21,
								 13, 5,60,52,44,36,28,
								 20,12,4,27,19,11, 3};
                                                                              //密钥PC2置换表
   static int           PC2[48]={13,16,10,23, 0, 4,
	                              2,27,14, 5,20, 9,
							     22,18,11, 3,25, 7,
							     15, 6,26,19,12, 1,
							     40,51,30,36,46,54,
							     29,39,50,44,32,47,
							     43,48,38,55,33,52,
							     45,41,49,35,28,31};



void Ns(unsigned char *ss,int *Nss)
{
      int i;
	  int Ns[64][16];
	  unsigned char a,b,x,y[6],t1,t2,t,aa[6],bb[4],s[4];
	  for(a=0;a<64;a++)
	  {	  
		                                 //print column number
		  if(a==0)
			 {
				 printf("   ");
			     for(b=0;b<16;b++)				 
					 printf("%3d ",b);
				 cout<<endl;
			 }
		                                 //print row number
		  printf("%2d ",a);
		  aa[0]=(a/32)%2;
			aa[1]=(a/16)%2;
			aa[2]=(a/8)%2;
			aa[3]=(a/4)%2;
			aa[4]=(a/2)%2;
			aa[5]=a%2;
		  for(b=0;b<16;b++) 
		  {
		     Ns[a][b]=0;
			 bb[0]=(b/8)%2;
			 bb[1]=(b/4)%2;
			 bb[2]=(b/2)%2;
			 bb[3]=b%2;
			 for(x=0;x<64;x++)
			 {
			    y[0]=(x/32)%2;
				y[1]=(x/16)%2;
				y[2]=(x/8)%2;
				y[3]=(x/4)%2;
				y[4]=(x/2)%2;
				y[5]=x%2;
							
				t1=y[0]*aa[0];
				for(i=1;i<6;i++)
				  t1^=y[i]*aa[i];
				
				t=ss[(2*y[0]+y[5])*16+8*y[1]+4*y[2]+2*y[3]+y[4]];
				s[0]=(t/8)%2;
			    s[1]=(t/4)%2;
			    s[2]=(t/2)%2;
			    s[3]=t%2;

				t2=s[0]*bb[0];
				for(i=1;i<4;i++)
				  t2^=s[i]*bb[i];

				if(t1==t2)
					Ns[a][b]++;
							 
			 }                            //x end;
			 Ns[a][b]=Ns[a][b]-32;			 
			 printf("%3d ",Ns[a][b]);
		  }                                  //b end;
		  printf("\n");
	  }                                         //a end;
	  Nss=&Ns[0][0];

   
}
void main()
{    
	int Ns5[64][16];
	int i,j;
	Ns(&s5[0][0],&Ns5[0][0]);
				 
	printf("   ");
	for(i=0;i<16;i++)				 
		printf("%3d ",i);
	cout<<endl;

/*	for(i=0;i<64;i++)
	{
		printf("%2d ",i);
		for(j=0;j<16;j++)
			printf("%3d ",Ns5[i][j]);
		cout<<endl; 
	}*/
/*	Ns(&s2[0][0]);
	Ns(&s3[0][0]);
	Ns(&s4[0][0]);
	Ns(&s5[0][0]);
	Ns(&s6[0][0]);
	Ns(&s7[0][0]);
	Ns(&s8[0][0]); */
}

⌨️ 快捷键说明

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