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

📄 idea.cpp

📁 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 + -