📄 desmain.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 + -