📄 差分分析.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 + -