📄 idea.cpp
字号:
// IDEA.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<math.h>
int W1[16];
int W2[16];
int W3[16];
int W4[16];
int Z1[16];
int Z2[16];
int Z3[16];
int Z4[16];
int Z5[16];
int Z6[16];
int Z7[16];
int Z8[16];
int Z9[16];
int Z10[16];
int Z11[16];
int Z12[16];
int Z13[16];
int Z14[16];
int Z15[16];
int Z16[16];
int Z17[16];
int Z18[16];
int Z19[16];
int Z20[16];
int Z21[16];
int Z22[16];
int Z23[16];
int Z24[16];
int Z25[16];
int Z26[16];
int Z27[16];
int Z28[16];
int Z29[16];
int Z30[16];
int Z31[16];
int Z32[16];
int Z33[16];
int Z34[16];
int Z35[16];
int Z36[16];
int Z37[16];
int Z38[16];
int Z39[16];
int Z40[16];
int Z41[16];
int Z42[16];
int Z43[16];
int Z44[16];
int Z45[16];
int Z46[16];
int Z47[16];
int Z48[16];
int Z49[16];
int Z50[16];
int Z51[16];
int Z52[16];
int key[128];
int Calcul(int W[]);
void Trans(unsigned short word,int flag);
void E_Round(int WP1[],int WP2[],int WP3[],int WP4[],int ZK1[],int ZK2[],int ZK3[],int ZK4[],int ZK5[],int ZK6[])
{
int wp1;
int wp2;
int wp3;
int wp4;
int zk1;
int zk2;
int zk3;
int zk4;
int zk5;
int zk6;
unsigned short res1;
unsigned short res2;
unsigned short res3;
unsigned short res4;
int mod_odd;
int mod_even;
int mod_M;
int mod_A;
unsigned short res_A;
unsigned short res_M;
unsigned short temp_res1;
unsigned short temp_res2;
unsigned short temp_res3;
unsigned short temp_res4;
//---------------调用Calcul函数把二进制数转化为十进制数-------------------
wp1=Calcul(WP1);
if(wp1==0) //如果16位二进制数都为0,则用2的16次方表示
wp1=int(pow(2,16));
wp2=Calcul(WP2);
wp3=Calcul(WP3);
wp4=Calcul(WP4);
if(wp4==0)
wp4=int(pow(2,16));
zk1=Calcul(ZK1);
if(zk1==0)
zk1=int(pow(2,16));
zk2=Calcul(ZK2);
zk3=Calcul(ZK3);
zk4=Calcul(ZK4);
if(zk4==0)
zk4=int(pow(2,16));
zk5=Calcul(ZK5);
if(zk5==0)
zk5=int(pow(2,16));
zk6=Calcul(ZK6);
if(zk6==0)
zk6=int(pow(2,16));
//----------------------进行MA(模乘和模加)运算----------------------
res1=unsigned short(wp1*zk1%int(pow(2,16)+1));
res2=unsigned short((wp2+zk2)%int(pow(2,16)));
res3=unsigned short((wp3+zk3)%int(pow(2,16)));
res4=unsigned short(wp4*zk4%int(pow(2,16)+1));
mod_odd=unsigned short((res1+res3)%int(pow(2,16)));
if(mod_odd==0)
mod_odd=int(pow(2,16));
mod_even=unsigned short(res2+res4)%int(pow(2,16));
mod_M=unsigned short(mod_odd*zk5 % int(pow(2,16)+1));
mod_A=unsigned short((mod_M+mod_even)%int(pow(2,16)));
if(mod_A==0)
mod_A=int(pow(2,16));
res_M=unsigned short(mod_A*zk6%int(pow(2,16)+1));
res_A=unsigned short(mod_M*res_M%int(pow(2,16)));
temp_res1=(unsigned short(res1+res_M)%int(pow(2,16)));
temp_res2=(unsigned short(res2+res_A)%int(pow(2,16)));
temp_res3=(unsigned short(res3+res_M)%int(pow(2,16)));
temp_res4=(unsigned short(res4+res_A)%int(pow(2,16)));
//------------------------调用Trans函数把十进制数转化为二进制数,并利用flag将中间2个16位串交换----------------
Trans(temp_res1,1);
Trans(temp_res2,2);
Trans(temp_res3,3);
Trans(temp_res4,4);
}
void Trans(unsigned short word,int flag)
{
int temp[16];
if(word==0)
for(int i=0;i<16;i++)
temp[i]=0;
else
{
int i=0;
while(word!=0)
{
temp[i]=word % 2;
word=word/2;
i++;
}
for(;i<16;i++)
temp[i]=0;
}
if(flag==1)
for(int j=0;j<16;j++)
W1[j]=temp[15-j];
else if(flag==2)
for(int j=0;j<16;j++)
W3[j]=temp[15-j];
else if(flag==3)
for(int j=0;j<16;j++)
W2[j]=temp[15-j];
else
for(int j=0;j<16;j++)
W4[j]=temp[15-j];
}
int Calcul(int W[])
{
int sum=0;
for(int i=0;i<16;i++)
if(W[i]!=0)
sum=sum+int(pow(2,15-i));
//if(sum==0)
//sum=int(pow(2,16));
return sum;
}
void Key_Ger(int Key[],int flag)
{
int temp[25];
//---------------------循环左移25位---------------------
for(int i=0;i<25;i++)
temp[i]=Key[i];
for(int i=0;i<103;i++)
Key[i]=Key[25+i];
for(int i=103,j=0;i<128;i++,j++)
Key[i]=temp[j];
//-------------------产生从Z9-Z52个Subkeys-----------------
if(flag==0)
{
for(int i=0;i<16;i++)
Z9[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z10[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z11[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z12[j]=Key[i];
for(int i=64,j=0;i<80;i++,j++)
Z13[j]=Key[i];
for(int i=80,j=0;i<96;i++,j++)
Z14[j]=Key[i];
for(int i=96,j=0;i<112;i++,j++)
Z15[j]=Key[i];
for(int i=112,j=0;i<128;i++,j++)
Z16[j]=Key[i];
}
if(flag==1)
{
for(int i=0;i<16;i++)
Z17[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z18[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z19[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z20[j]=Key[i];
for(int i=64,j=0;i<80;i++,j++)
Z21[j]=Key[i];
for(int i=80,j=0;i<96;i++,j++)
Z22[j]=Key[i];
for(int i=96,j=0;i<112;i++,j++)
Z23[j]=Key[i];
for(int i=112,j=0;i<128;i++,j++)
Z24[j]=Key[i];
}
if(flag==2)
{
for(int i=0;i<16;i++)
Z25[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z26[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z27[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z28[j]=Key[i];
for(int i=64,j=0;i<80;i++,j++)
Z29[j]=Key[i];
for(int i=80,j=0;i<96;i++,j++)
Z30[j]=Key[i];
for(int i=96,j=0;i<112;i++,j++)
Z31[j]=Key[i];
for(int i=112,j=0;i<128;i++,j++)
Z32[j]=Key[i];
}
if(flag==3)
{
for(int i=0;i<16;i++)
Z33[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z34[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z35[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z36[j]=Key[i];
for(int i=64,j=0;i<80;i++,j++)
Z37[j]=Key[i];
for(int i=80,j=0;i<96;i++,j++)
Z38[j]=Key[i];
for(int i=96,j=0;i<112;i++,j++)
Z39[j]=Key[i];
for(int i=112,j=0;i<128;i++,j++)
Z40[j]=Key[i];
}
if(flag==4)
{
for(int i=0;i<16;i++)
Z41[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z42[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z43[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z44[j]=Key[i];
for(int i=64,j=0;i<80;i++,j++)
Z45[j]=Key[i];
for(int i=80,j=0;i<96;i++,j++)
Z46[j]=Key[i];
for(int i=96,j=0;i<112;i++,j++)
Z47[j]=Key[i];
for(int i=112,j=0;i<128;i++,j++)
Z48[j]=Key[i];
}
if(flag==5)
{
for(int i=0;i<16;i++)
Z49[i]=Key[i];
for(int i=16,j=0;i<32;i++,j++)
Z50[j]=Key[i];
for(int i=32,j=0;i<48;i++,j++)
Z51[j]=Key[i];
for(int i=48,j=0;i<64;i++,j++)
Z52[j]=Key[i];
}
for(int i=0;i<128;i++)
key[i]=Key[i];
}
void main()
{
int plaintext[64]; //保存64位明文
int key[128]={ 0,0,0,0,0,0,1, //保存第1个56位密钥
1,0,0,1,0,1,1,
0,1,0,0,1,0,0,
1,1,0,0,0,1,0,
0,0,1,1,1,0,0,
0,0,1,1,0,0,0,
0,0,1,1,1,0,0,
0,1,1,0,0,1,0,
1,0,0,1,0,1,1,
0,1,0,0,1,0,0,
1,1,0,0,0,1,0,
0,0,1,1,1,0,0,
0,0,1,1,0,0,0,
0,0,1,1,1,0,0,
0,1,1,0,0,1,0,
0,0,0,0,0,0,1};
int ciphertext[64]; //保存最终的密文
/*int temp[25]; */ //保存移位
int w1;
int w2;
int w3;
int w4;
unsigned short Y1;
unsigned short Y2;
unsigned short Y3;
unsigned short Y4;
int z49;
int z50;
int z51;
int z52;
for(int i=0;i<64;i++)
plaintext[i]=1;
///-------------------拆分64位明文为4个16位
for(int i=0;i<16;i++)
W1[i]=plaintext[i];
for(int i=16,j=0;i<32;i++,j++)
W2[j]=plaintext[i];
for(int i=32,j=0;i<48;i++,j++)
W3[j]=plaintext[i];
for(int i=48,j=0;i<64;i++,j++)
W4[j]=plaintext[i];
///-------------------拆分128位密钥为8个16位子钥
for(int i=0;i<16;i++)
Z1[i]=key[i];
for(int i=16,j=0;i<32;i++,j++)
Z2[j]=key[i];
for(int i=32,j=0;i<48;i++,j++)
Z3[j]=key[i];
for(int i=48,j=0;i<64;i++,j++)
Z4[j]=key[i];
for(int i=64,j=0;i<80;i++,j++)
Z5[j]=key[i];
for(int i=80,j=0;i<96;i++,j++)
Z6[j]=key[i];
for(int i=96,j=0;i<112;i++,j++)
Z7[j]=key[i];
for(int i=112,j=0;i<128;i++,j++)
Z8[j]=key[i];
//-------------------------调用Key_Ger函数产生所有subkeys---------------------
int flag=0;
for(int r=0;r<6;r++,flag++)
Key_Ger(key,flag);
//--------------------进行8轮加密------------------------
E_Round(W1,W2,W3,W4,Z1,Z2,Z3,Z4,Z5,Z6);
E_Round(W1,W2,W3,W4,Z7,Z8,Z9,Z10,Z11,Z12);
E_Round(W1,W2,W3,W4,Z13,Z14,Z15,Z16,Z17,Z18);
E_Round(W1,W2,W3,W4,Z19,Z20,Z21,Z22,Z23,Z24);
E_Round(W1,W2,W3,W4,Z25,Z26,Z27,Z28,Z29,Z30);
E_Round(W1,W2,W3,W4,Z31,Z32,Z33,Z34,Z35,Z36);
E_Round(W1,W2,W3,W4,Z37,Z38,Z39,Z40,Z41,Z42);
E_Round(W1,W2,W3,W4,Z43,Z44,Z45,Z46,Z47,Z48);
//---------------调用Calcul函数把二进制数转化为十进制数-------------------
w1=Calcul(W1);
if(w1==0)
w1=int(pow(2,16));
w2=Calcul(W2);
w3=Calcul(W3);
w4=Calcul(W4);
if(w4==0)
w4=int(pow(2,16));
z49=Calcul(Z49);
if(z49==0)
z49=int(pow(2,16));
z50=Calcul(Z50);
z51=Calcul(Z51);
z52=Calcul(Z52);
if(z52==0)
z52=int(pow(2,16));
//--------------Output Transformation----------------------------
Y1=unsigned short(w1*z49%int(pow(2,16)+1));
Y2=unsigned short((w3+z50)%int(pow(2,16)));
Y3=unsigned short((w2+z51)%int(pow(2,16)));
Y4=unsigned short(w4*z52%int(pow(2,16)+1));
//------------------------调用Trans函数把十进制数转化为二进制数-----------------
Trans(Y1,1);
Trans(Y2,3);
Trans(Y3,2);
Trans(Y4,4);
//-------------------------得到64位密文-----------------------
for(int i=0;i<16;i++)
ciphertext[i]=W1[i];
for(int i=16,j=0;i<32;i++,j++)
ciphertext[i]=W2[j];
for(int i=32,j=0;i<48;i++,j++)
ciphertext[i]=W3[j];
for(int i=48,j=0;i<64;i++,j++)
ciphertext[i]=W4[j];
for(int i=0;i<64;i++)
printf("%d ",ciphertext[i]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -