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

📄 calculate_ji_calculate_key.cpp

📁 实现《密码学导引》一书中DES算法差分攻击。输出J1-J8及密钥Key。默认是3轮DES
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include"stdio.h"
#include"iostream.h"
#define Round 3                                                  //control the round of DES
#define N 8


    static unsigned char 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};

	                                                             //P置换表
	static unsigned char 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};

	                                                            //Expand 扩展表
	static unsigned char  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 };


	

                                                                                        /* 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 };
   
   static unsigned char 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};

   static unsigned char 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};

   static unsigned char 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 test(unsigned char *EL,unsigned char *el,unsigned char *c,unsigned char *J)
{
	
	
	unsigned char ELd[48],B[48],B1[48];
	register i,j,p,C;

	

	for(i=0;i<48;i++)
		ELd[i]=EL[i]^el[i];		
                                                   //J1
	C=0;
	for(j=0;j<4;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}
	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=5;j>=0;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s1[2*B[0]+B[5]][8*B[1]+4*B[2]+2*B[3]+B[4]]^s1[2*B1[0]+B1[5]][8*B1[1]+4*B1[2]+2*B1[3]+B1[4]])==C)		  
		{
			p=0;
		    for(j=0;j<6;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[p]++;
		}

				    
	}
                                                  //J2
	C=0;
	for(j=4;j<8;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}


	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=11;j>=6;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s2[2*B[6]+B[11]][8*B[7]+4*B[8]+2*B[9]+B[10]]^s2[2*B1[6]+B1[11]][8*B1[7]+4*B1[8]+2*B1[9]+B1[10]])==C)		  
		{
			
			p=0;
		    for(j=6;j<12;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64+p]++;
		}

				    
	}
	                                           //J3
	C=0;
	for(j=8;j<12;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}


	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=17;j>=12;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s3[2*B[12]+B[17]][8*B[13]+4*B[14]+2*B[15]+B[16]]^s3[2*B1[12]+B1[17]][8*B1[13]+4*B1[14]+2*B1[15]+B1[16]])==C)		  
		{
			
			p=0;
		    for(j=12;j<18;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*2+p]++;
		}

				    
	}
	                        //J4
	C=0;
	for(j=12;j<16;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}


	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=23;j>=18;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s4[2*B[18]+B[23]][8*B[19]+4*B[20]+2*B[21]+B[22]]^s4[2*B1[18]+B1[23]][8*B1[19]+4*B1[20]+2*B1[21]+B1[22]])==C)		  
		{
			
			p=0;
		    for(j=18;j<24;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*3+p]++;
		}

				    
	}
	                      //J5
	C=0;
	for(j=16;j<20;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}


	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=29;j>=24;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s5[2*B[24]+B[29]][8*B[25]+4*B[26]+2*B[27]+B[28]]^s5[2*B1[24]+B1[29]][8*B1[25]+4*B1[26]+2*B1[27]+B1[28]])==C)		  
		{
			
			p=0;
		    for(j=24;j<30;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*4+p]++;
		}

				    
	}
	                         //J6
	C=0;
	for(j=20;j<24;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}

	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=35;j>=30;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s6[2*B[30]+B[35]][8*B[31]+4*B[32]+2*B[33]+B[34]]^s6[2*B1[30]+B1[35]][8*B1[31]+4*B1[32]+2*B1[33]+B1[34]])==C)		  
		{
			
			p=0;
		    for(j=30;j<36;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*5+p]++;
		}

				    
	}
	                           //J7
	C=0;
	for(j=24;j<28;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}

	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=41;j>=36;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s7[2*B[36]+B[41]][8*B[37]+4*B[38]+2*B[39]+B[40]]^s7[2*B1[36]+B1[41]][8*B1[37]+4*B1[38]+2*B1[39]+B1[40]])==C)		  
		{
			
			p=0;
		    for(j=36;j<42;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*6+p]++;
		}

				    
	}
	                         //J8
	C=0;
	for(j=28;j<32;j++)
	{
		  C=C*2;
	      C=C+c[j];
	}

	for(i=0;i<64;i++)
	{   
		p=i;
		for(j=47;j>=42;j--)
		{
			B[j]=p%2;
			 p=p/2;
			B1[j]=ELd[j]^B[j];
		}
		
		if((s8[2*B[42]+B[47]][8*B[43]+4*B[44]+2*B[45]+B[46]]^s8[2*B1[42]+B1[47]][8*B1[43]+4*B1[44]+2*B1[45]+B1[46]])==C)		  
		{
			
			p=0;
		    for(j=42;j<48;j++)
			{
			    p=p*2;
				p=p+(B[j]^EL[j]);
			   
			}
			J[64*7+p]++;
		}

				    
	}


		

}

void differentialattack(unsigned char *plaintext1,unsigned char *ciphertext1,unsigned char *plaintext2,unsigned char *ciphertext2,unsigned char *J)
{
	
	                                                           
	
	unsigned char   L0[32],l0[32],
		            L3[32],R3[32],l3[32],r3[32],L[32],R[32],c[32],
					EL[48],el[48];
	register i,p1,p2,j;

⌨️ 快捷键说明

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