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

📄 diffattack.cpp

📁 spn算法加密和解密
💻 CPP
字号:
#include "GenFile.h"
#include "DiffAttack.h"

int main(){	
	//参数设置
	unsigned int InitKey=58524;     //设置初始密钥
	/*输出控制:控制是否输出各个候选子密钥
	对应的x'产生u4'的概率表,为1表示输出,为0不输出。*/
	int view=1; 

	char *CrackFileName="CrackFile.txt";    //破解所需特定已知明文文件
	char *CipherFileName="CipherFile.txt";  //密文文件

	const int Nr=4;   //Nr+1为迭代次数
	long int size;    //已知名密文规模
	unsigned int Key[Nr+1];  //={1,24,4544,0xffff,0xffff}; //手动设置轮密钥
	unsigned int Sbox[16]={14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7};  //固定S盒
	unsigned int Pbox[16]={0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15};  //固定P盒
	unsigned int iSbox[16], iPbox[16];   //S及P逆盒

	//由初始密钥自动产生轮密钥
	GenKey(Key,Nr,InitKey);
	
	//产生S逆盒
	GeniBox(Sbox,iSbox);

	//产生P逆盒
	GeniBox(Pbox,iPbox);

	int layer;           //所要破解的密钥所属层数
	unsigned int subkey; //所要破解的子密钥
	unsigned int AppKey[Nr+1];  //破解所得密钥存放的数组


	//破解第Nr+1轮子密钥
	layer=Nr+1;          //所要破解的密钥所属层数


	//破解子密钥key1、key3
	clock_t start=clock();  //设置计时器
	subkey=0xf0f0;       
	size=2000;              //设置激励的明文数
	//产生激励文件(明文)
	FixFile(CrackFileName,size,1,XNorVal(layer,subkey));  
	//加密激励文件
	SPNS(CrackFileName,CipherFileName,Key,Nr,Sbox,Pbox);
	//破解,view为1时显示各个候选子密钥对应的x'产生u4'的概率表。
	AppKey[layer-1]=DiffAttack(CrackFileName,CipherFileName,
		                       iSbox,iPbox,Nr,layer,subkey,view);
	//输出破解时间
	cout<<"破解第"<<layer<<"层子密钥的K1、k3部分所用的时间为: ";
	cout<<(double)(clock()-start)/CLOCKS_PER_SEC<<endl<<endl;


	//破解子密钥key2、key4
	start=clock();  //设置计时器
	subkey=0x0f0f;       
	size=4000;             //设置激励的明文数
	//产生激励文件(明文)
	FixFile(CrackFileName,size,1,XNorVal(layer,subkey));  
	//加密激励文件
	SPNS(CrackFileName,CipherFileName,Key,Nr,Sbox,Pbox);
	//破解,view为1时显示各个候选子密钥对应的x'产生u4'的概率表。
	AppKey[layer-1]|=DiffAttack(CrackFileName,CipherFileName,
		                        iSbox,iPbox,Nr,layer,subkey,view);
	//输出破解时间
	cout<<"破解第"<<layer<<"层子密钥的K2、k4部分所用的时间为: ";
	cout<<(double)(clock()-start)/CLOCKS_PER_SEC<<endl<<endl;



	//输出真实密钥
	for(int i=Nr;i<Nr+1;i++){
		cout<<"\n真实的第"<<i+1<<"层子密钥为: \n";
		Binary(Key[i]);
		cout<<endl;
	}

	//输出破解密钥
	for(i=Nr;i<Nr+1;i++){
		cout<<"\n破解出的第"<<i+1<<"层子密钥为: \n";
		Binary(AppKey[i]);
		cout<<endl;
	}
	cout<<endl;

	//删除临时文件,返回。
	DeleteFile(CrackFileName);	
	DeleteFile(CipherFileName);	
	return 1;
}

⌨️ 快捷键说明

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