📄 decode.c
字号:
b3[5]=a3[1]+a3[6]+a3[7]+a0[0]+a0[1]+a0[5]+a0[6]+a1[1]+a1[5]+a1[7]+a2[0]+a2[1]
+a2[5];
b3[6]=a3[2]+a3[7]+a0[0]+a0[1]+a0[2]+a0[6]+a0[7]+a1[0]+a1[2]+a1[6]+a2[1]+a2[2]
+a2[6];
b3[7]=a3[0]+a3[1]+a3[2]+a0[0]+a0[2]+a0[7]+a1[1]+a1[2]+a1[7]+a2[2]+a2[7];
for(k=0;k<8;k++)
{a0[k]=b0[k]%2;
a1[k]=b1[k]%2;
a2[k]=b2[k]%2;
a3[k]=b3[k]%2;
}
sum=0;
for(k=0;k<8;k++)
sum=sum+a0[k]*(int)pow(2,7-k);
*(*(pinfo+0)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a1[k]*(int)pow(2,7-k);
*(*(pinfo+1)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a2[k]*(int)pow(2,7-k);
*(*(pinfo+2)+j)=sum;
sum=0;
for(k=0;k<8;k++)
sum=sum+a3[k]*(int)pow(2,7-k);
*(*(pinfo+3)+j)=sum;
}
}
void InvAddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[Nb*N+Nb],int
round)
{int i,j,k;
int temp,sum;
for(i=0;i<4;i++)
for(j=0;j<Nb;j++)
{sum=0;
for(k=0;k<8;k++)
{if((*(*(pinfo+i)+j)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+round*Nb+j)/(int)
pow(2,k))%2))
temp=1;
else
temp=0;
sum=sum+temp*(int)pow(2,k);
}
*(*(pinfo+i)+j)=sum;
}
}
void KeyExpansion(int (*pKey_Original)[Nk],int (*pRoundKey)[N*Nb+Nb])
{int i,j,k;
int sum,temp;
int a[8]={0,0,0,0,0,0,0,1};
int b[8]={0,0,0,0,0,0,0,0};
int RC[(N*Nb+Nb-1)/Nk+1];
RC[1]=1;
for(j=0;j<Nk;j++)
for(i=0;i<4;i++)
*(*(pRoundKey+i)+j)=*(*(pKey_Original+i)+j);
for(j=2;j<(N*Nb+Nb-1)/Nk+1;j++)
{b[0]=a[1];
b[1]=a[2];
b[2]=a[3];
b[3]=a[0]+a[4];
b[4]=a[0]+a[5];
b[5]=a[6];
b[6]=a[0]+a[7];
b[7]=a[0];
sum=0;
for(k=0;k<8;k++)
{a[k]=b[k]%2;
sum=sum+a[k]*(int)pow(2,7-k);
}
RC[j]=sum;
}
for(j=Nk;j<N*Nb+Nb;j++)
{if(j%4!=0)
{for(i=0;i<4;i++)
{sum=0;
for(k=0;k<8;k++)
{if((*(*(pRoundKey+i)+j-1)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+j-4)/(int)pow
(2,k))%2))
temp=1;
else
temp=0;
sum=sum+temp*(int)pow(2,k);
}
*(*(pRoundKey+i)+j)=sum;
}
}
if(j%4==0)
{for(i=0;i<4;i++)
*(*(pRoundKey+i)+j)=*(*(pRoundKey+i)+j-1);
temp=*(*(pRoundKey+0)+j);
for(i=0;i<4;i++)
*(*(pRoundKey+i)+j)=*(*(pRoundKey+i+1)+j);
*(*(pRoundKey+3)+j)=temp;
for(i=0;i<4;i++)
*(*(pRoundKey+i)+j)=SearchSbox(*(*(pRoundKey+i)+j));
sum=0;
for(k=0;k<8;k++)
{if((*(*(pRoundKey+0)+j)/(int)pow(2,k))%2!=((RC[j/Nk]/(int)pow(2,k))%
2))
temp=1;
else
temp=0;
sum=sum+temp*(int)pow(2,k);
}
*(*(pRoundKey+0)+j)=sum;
for(i=1;i<4;i++)
{sum=0;
for(k=0;k<8;k++)
{if((*(*(pRoundKey+i)+j)/(int)pow(2,k))%2==1)
temp=1;
else
temp=0;
sum=sum+temp*(int)pow(2,k);
}
*(*(pRoundKey+i)+j)=sum;
}
for(i=0;i<4;i++)
{sum=0;
for(k=0;k<8;k++)
{if((*(*(pRoundKey+i)+j)/(int)pow(2,k))%2!=((*(*(pRoundKey+i)+j-Nk)/(int)pow
(2,k))%2))
temp=1;
else
temp=0;
sum=sum+temp*(int)pow(2,k);
}
*(*(pRoundKey+i)+j)=sum;
}
}
}
}/*密钥扩展*/
int SearchSbox(int info)
{int tens,ones,temp_tens,temp_ones;
tens=info/16;
ones=info%16;
temp_tens=upper_sbox[tens][ones];
temp_ones=lower_sbox[tens][ones];
info=temp_tens*16+temp_ones;
return (info);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -