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

📄 差分分析.cpp

📁 差分密码分析
💻 CPP
字号:
//利用书中的算法进行差分攻击:
#include<fstream.h>
#include<stdlib.h>
#include<math.h>
#include<iomanip.h>

static char w[9];                //由y整合的
static char w1[9];               //由y整合的
static char u[9];                //算法中的u
static char u1[9];               //算法中的u
static char v[9];                //算法中的v
static char v1[9];               //算法中的v
char cc[9];

void xor(char *c1,char *c2)                 //异或运算,相同为零,不同为一
{ 
	for(int i=0;i<8;i++)
	{
		if(c1[i]==c2[i])
           v[i]='0';
		else v[i]='1';
	}
	return ;
}

void xor1(char *c1,char *c2)
{ 
	for(int i=0;i<8;i++)
	{
		if(c1[i]==c2[i])
           v1[i]='0';
		else v1[i]='1';
	}
	return ;
}

void alt_s(char * c)                              //实现S盒的逆运算
{
	int a[2];
	for(int i=0;i<2;i++)
	{
		a[i]=(c[i*4]-48)*8+(c[i*4+1]-48)*4+(c[i*4+2]-48)*2+c[i*4+3]-48;
    	switch (a[i])
		{
        	case 0:  a[i]=14; break;	
        	case 1:  a[i]=3;  break;
        	case 2:  a[i]=4;  break;	
        	case 3:  a[i]=8;  break;
        	case 4:  a[i]=1;  break;
        	case 5:  a[i]=12; break;	
        	case 6:  a[i]=10; break;
        	case 7:  a[i]=15; break;
        	case 8:  a[i]=7;  break;
        	case 9:  a[i]=13; break;
        	case 10: a[i]=9;  break;
        	case 11: a[i]=6;  break;
        	case 12: a[i]=11; break;
        	case 13: a[i]=2;  break;
        	case 14: a[i]=0;  break;
        	case 15: a[i]=5;  break;
		}
	}
	for(i=0;i<2;i++)
	{
		if(a[i]>=8)
		{
			u[i*4]='1';
			a[i]=a[i]-8;
		}
		else
			u[i*4]='0';
		if(a[i]>=4)
		{
			u[i*4+1]='1';
			a[i]=a[i]-4;
		}
		else
			u[i*4+1]='0';
			if(a[i]>=2)
		{
			u[i*4+2]='1';
			a[i]=a[i]-2;
		}
		else
			u[i*4+2]='0';
			if(a[i]==1)
				u[i*4+3]='1';
			else
				u[i*4+3]='0';
	}
}

void alt_s1(char * c)                              //实现S盒的逆运算
{
	int a[2];
	for(int i=0;i<2;i++)
	{
		a[i]=(c[i*4]-48)*8+(c[i*4+1]-48)*4+(c[i*4+2]-48)*2+c[i*4+3]-48;
    	switch (a[i])
		{
        	case 0:  a[i]=14; break;	
        	case 1:  a[i]=3;  break;
        	case 2:  a[i]=4;  break;	
        	case 3:  a[i]=8;  break;
        	case 4:  a[i]=1;  break;
        	case 5:  a[i]=12; break;	
        	case 6:  a[i]=10; break;
        	case 7:  a[i]=15; break;
        	case 8:  a[i]=7;  break;
        	case 9:  a[i]=13; break;
        	case 10: a[i]=9;  break;
        	case 11: a[i]=6;  break;
        	case 12: a[i]=11; break;
        	case 13: a[i]=2;  break;
        	case 14: a[i]=0;  break;
        	case 15: a[i]=5;  break;
		}
	}
	for(i=0;i<2;i++)
	{
		if(a[i]>=8)
		{
			u1[i*4]='1';
			a[i]=a[i]-8;
		}
		else
			u1[i*4]='0';
		if(a[i]>=4)
		{
			u1[i*4+1]='1';
			a[i]=a[i]-4;
		}
		else
			u1[i*4+1]='0';
			if(a[i]>=2)
		{
			u1[i*4+2]='1';
			a[i]=a[i]-2;
		}
		else
			u1[i*4+2]='0';
			if(a[i]==1)
				u1[i*4+3]='1';
			else
				u1[i*4+3]='0';
	}
}

void B_D(int x)
{
	int j;
	for(int i=7;i>=0;i--)
	{
		j=x%2;
		cc[i]=j+48;
		x=x/2;
	}

}

int  get_z(char *c)
{
	int a=0;
	for(int i=0;i<5;i++)
		if(c[i]-'1'==0)
			a++;
	return a%2;
}

void main()
{
    int e=1;
	int L,num=0,max=-1,n;
	char y[17],y1[17];
	char maxkey[9];
	ifstream fin_sj1 ,fin_sj1_1,fin_sj2,fin_sj2_1 ;
	for(L=0;L<256;L++)   {
	fin_sj1.open("随机数.txt");
	fin_sj1_1.open("随机数1.txt");
    fin_sj2.open("密文流.dat");
	fin_sj2_1.open("密文流1.dat");	
	B_D(L);
	num=0;
	for(int j=0;j<16000;j++)   
	{
	for(int i=0;i<16;i++)
		fin_sj2>>y[i];
	for(i=0;i<16;i++)
		fin_sj2_1>>y1[i];
	if(y[0]!=y1[0]||y[1]!=y1[1]||y[2]!=y1[2]||y[3]!=y1[3]||y[8]!=y1[8]||y[9]!=y1[9]
		||y[10]!=y1[10]||y[11]!=y1[11])
		continue;
	for(i=4;i<8;i++)
		w[i-4]=y[i];
	for(i=12;i<16;i++)
		w[i-8]=y[i];
	xor(cc,w);
	alt_s(v);
	for(i=4;i<8;i++)
		w1[i-4]=y1[i];
	for(i=12;i<16;i++)
		w1[i-8]=y1[i];
	xor1(cc,w1);
	alt_s1(v1);
	xor(u,u1);
    if(v[0]-'0'==0&&v[1]-'1'==0&&v[2]-'1'==0&&v[3]-'0'==0&&v[4]-'0'==0&&v[5]-'1'==0
		&&v[6]-'1'==0&&v[7]-'0'==0)
		num++;
	}
	cout<<"num["<<setw(3)<<e<<"]="<<setw(2)<<num<<setw(6);
	if(e%6==0) cout<<"\n";
	e++;
	if(num>max)
	{
		max=num;
		for(int i=0;i<8;i++)
			maxkey[i]=cc[i];
		n=L;
	}
    fin_sj1.close();
	fin_sj1_1.close();
    fin_sj2.close();
	fin_sj2_1.close();
	}
	cout<<"\nmaxnum is "<<max<<endl;
	cout<<"so the key is:";
	for(int i=0;i<8;i++)
		cout<<maxkey[i];
	cout<<endl;	
	return;
}

⌨️ 快捷键说明

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