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

📄 desmain.cpp

📁 实现了三种古典密码学体制和DES体制及其分析。affine(仿射)读入文件11.txt中内容(小写字母
💻 CPP
字号:
#include<iostream>
#include<time.h>
#include <iomanip>

#include "DES.h"

using namespace std;

#define MAX_FILENAME 80

void geneKey (bool* key);
void genePlain(unsigned long  n ,bool* first , bool* second );
void printarray(bool* a, unsigned long l);
void xue();
void NDS();//差分分析

int main()
{

	int i;
	int numread;

	FILE* file;
	FILE* file2;
    char SouFileName[MAX_FILENAME];  
    char DesFileName[MAX_FILENAME];  
	char* buffer;
	char sel;

	Des key;
    Des plain;
	Des cipher;

	buffer = new char[8];

	cout<<"程序:DES 加密解密并分析雪崩效应及对S盒进行差分分析."<<endl;
BEGIN:
	cout<<"请输入您选择的操作:\n\t1.加密。\n\t2.解密\n\t3.分析雪崩效应\n\t4.差分分析\n\t5.退出.\n"<<endl;
	cin>>sel;

	if( (sel - '1') <0  && (sel - '1' ) > 4)
	{
		cout << "您的选择有误,请重新输入!";
		goto   BEGIN;
	}
	
	if (sel == '3')
	{
		xue();
		goto	BEGIN;
	//	return 0;
	}
	if(sel == '4')
	{
		NDS();
		goto    BEGIN;
	//	return 0;
	}
	if (sel == '5') 
	{
		return 0;
	}

START:
    cout << "请输入需要\"处理\"的文本文件名(注意包括其路径及扩展名):";
    cin >> SouFileName ;	
	if((file = fopen(SouFileName,"r+b")) == NULL)
	{
		cout<<"无法打开文件。"<<endl;
		goto START;
	}

NEXT:
    cout<<"处理后文件存为(包括文件名、路径和扩展名):" ;
    cin >> DesFileName; 
	file2 = fopen(DesFileName,"w+b");
	if(file2 == NULL) {
         cout<<"您的输入有误,请重新输入。"<<endl;
         goto NEXT;
    }
//密钥:	
	cout<<"请输入8字节密钥:";
	for( i = 0 ; i < 8 ; i++ )
		cin >> buffer[i];
	 key.ByteToDes(buffer,64);
	 		memset( buffer, (char)0, 8 );

	 cout <<"密钥串为:" <<endl;
	key.print();
	cout << "正在处理,请稍候。。。" << endl;

	while (	(numread = fread(buffer, sizeof(char), 8, file ))>0)
	{//

		plain.ByteToDes(buffer,64);

		if(sel == '1')

		{ 
			cipher = plain.Encrpty(key);
		}
		else if(sel == '2')
		{
			cipher = plain.Decrpty(key);
		//cipher = plain ;
		}
		//cipher.print();
		if((sel == '1') || ( sel == '2'))
		{
			buffer = cipher.DesToByte();
			fwrite(buffer,sizeof(char),8,file2);
		}
  		memset( buffer, (char)0, 8 );
	
	}

	delete [] buffer;
    fclose(file);          
    fclose(file2);  
	cout << "处理结束,请查看。谢谢!" << endl;



	return 0;
}

void xue()
{
	unsigned long len = 0;
	bool* first , * second ,*k;
	k = new bool [64];
	
	srand(time(NULL));
	while(len <=0 || len >= 1024*8)
	{
		cout << "请输入明文长度(0 - 9192)(作为测试先取64的整数倍))";
		cin  >>  len;
	}
	first  = new bool [len];
	second = new bool [len];

	genePlain(len, first, second);
	Des fir(first,len);
	Des sec(second,len);

	cout<<"两个明文串分别为:\n";
	printarray(first,len);
	printarray(second,len);
	
	cout<<"产生的64比特随机密钥为:\n";
	geneKey(k);
	Des key(k,64);
	printarray(k,64);

	delete [] first;
	delete [] second;
	delete [] k;

	int i;

	unsigned long count[18] = {0};

	for( i = 0 ; i < (len/64) ; i++)
	{
		Des plain1(fir.getptr(),64);
		Des plain2(sec.getptr(),64);

		plain1.xuebeng(key, plain2,  count);

		fir << 64;
		sec << 64;
	}
	for(i = 1 ; i < 17 ; i++ )
		cout<<"第"<<i<<"轮后不同位的个数"<<count[i]<<endl;
}
void printarray(bool* a, unsigned long l)
{
	int i;
	for(i = 0 ; i < l ; i ++)
	{
		//if(i % 8 == 0 )
			//cout<<endl;
		cout<<a[i];
	}
	cout<<endl;
}
void genePlain(unsigned long  n ,bool* first , bool* second )
{//产生只有一位不同的长度为n两个明文
	int i,j;
	
//	srand(time(NULL));

	for(i = 0 ; i < n ; i ++)
	{
		j = rand() % 2;
		first[i]  = (bool)j;
		second[i] = (bool)j;
	}

	j = rand() % n;
	first[j] = ! first[j];
	cout<<"第"<<j+1<<"位不同"<<endl;
}

void geneKey (bool* key)
{
	int i,j;
	
	//key = new bool [64];
//	_sleep();
//	srand(time(NULL));

	for( i = 0 ; i < 64 ; i ++)
	{
		j = rand() % 2; 
		key[i]  = (bool)j ;
	}
}

void NDS()
{
	int i,j;
	int n;
	char sel;
	Des plain1,plain2;
	int ND[64][16]={0};

REPUT:
	cout<<"请输入需要进行差分分析的盒号(0-9)"<<endl;
	cout<<"-->若要对DES的S盒进行差分分析请选择0-7."<<endl;
	cout<<"-->若要对随机的S盒进行差分分析盒号请选择8."<<endl;
	cout<<"-->若要对基于线性变换进行差分分析盒号请选择9."<<endl;

	cin>>n;
	

	if(n <0 || n>9)
	{//S8为作为与前8个盒的对比
		cout<<"您的输入有误。"<<endl;
		goto REPUT;
	}

	for(i = 0; i< 64; i++)
		for(j = 0; j < 64; j++)
		{
			plain1.IntToDes(i,6);
			plain2.IntToDes(j,6);
			plain2.Difference(plain1,plain2,n,&ND[0][0]);
		}

	cout<<"S"<<n<<"上的差分分布表为:\n\t";
	
	for(i = 0 ; i < 16 ; i++  )
		cout<<setw(4)<<i;
	cout<<endl;

	for(i = 0; i < 64; i ++)
	{
		cout<<i<<"\t";
		for( j = 0; j < 16; j++)
		{
			cout<<setw(4)<<ND[i][j];
		}
		cout<<endl;
	}

}

⌨️ 快捷键说明

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