📄 dse.cpp
字号:
#include"declare.h"
void InitRead()
{//从文件中读入数据
int i;
char a[16];//a[16]只在本函数使用
FILE *fp;
if ((fp=fopen("InitPlaintext.txt","rb"))==NULL)
{
printf("Cannot open the file!\n");
exit(0);
}
for(i=0;i<16;i++)
fread(&a[i],sizeof(char),16,fp);
for(i=0;i<16;i++)
T[i]=a[i]-48;
cout<<"班号: 09040602 姓名: 李振 学号: 062255"<<endl<<endl;
cout<<"身份证件号码前16位: ";
for(i=0;i<16;i++)
cout<<T[i];
cout<<endl<<endl;
// printf("%c ",a[i]);
fclose(fp);
printf("明文是:");
for(i=0;i<16;i++)
{
Binary(T[i]);
}
for(i=0;i<64;i++)
{
cout<<Text[i];
if((i+1)%8==0)
cout<<" ";
}
}
void InitKey()
{
int i;
FILE *fp1;
if ((fp1=fopen("Key.txt","rb"))==NULL)
{
printf("Cannot open the file!\n");
exit(0);
}
for(i=0;i<7;i++)
fread(&k[i],sizeof(char),7,fp1);
// for(i=0;i<7;i++)//输出每个密钥字符的ASCII码
// printf("%d",k[i]);
// cout<<endl;
for(i=0;i<7;i++)
Binary1(k[i]);
}
bool XOR(bool &a,bool &b)//异或函数
{
if(a==b)
return 0;
else return 1;
}
void Binary(int n)//将字符转化成8421BCD码
{
int i=0,c[4]={0},t;
static int j=0;
char B[4]={0};//每个数字对应的4位二进制码
do
{
t=n%2;
n=n/2;
c[i++]=t;
}while(n!=0);
for(i=0;i<4 ;i++){
B[i]=c[3-i]+48;
Text[j++]=B[i]-48;
//printf("%c",B[i]);
}
//printf(" ");
}
void Binary1(int n)//将字符转化成二进制码
{
int i=0,c[8]={0},t;
static int j=0;
char B1[8]={0};//每个字符对应的8位二进制码
do
{
t=n%2;
n=n/2;
c[i++]=t;
}while(n!=0);
for(i=0;i<8;i++){
B1[i]=c[7-i]+48;
Key1[j++]=B1[i]-48;
//printf("%c",B1[i]);
}
//printf(" ");
}
void Binary2(int n,bool a[4])//将十进制数转化为四位二进制数
{
int i=0,c[4]={0},t;
do
{
t=n%2;
n=n/2;
c[i++]=t;
}while(n!=0);
for(i=0;i<4 ;i++)
a[i]=c[3-i];
}
/*void IP_Convert()//进行IP变换
{
int i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
Text_IP[i][j]=Text[IP[i][j]-1];
}*/
void MakeSubKey()//产生子密钥
{
bool KeyPC_1[56]={0};
int i,j;
for(i=0,j=0;i<56;i++)
{
Key[j++]=Key1[i];
if((i+1)%7==0)
j++;
}
printf("密钥是:");
for(i=0;i<64;i++)
{
cout<<Key[i];
if((i+1)%8==0)
cout<<" ";
}
cout<<endl<<endl;
for(i=0;i<8;i++)
for(j=0;j<7;j++)
{
KeyPC_1[7*i+j]=Key[PC_1[i][j]-1];
}//密钥通过PC_1置换后
for(i=0;i<56;i++)
{
if(i<28)
C[0][i]=KeyPC_1[i];
else D[0][i-28]=KeyPC_1[i];
}//通过PC_1已验证正确
for(i=0;i<16;i++)
{
for(j=0;j<28;j++)
{
C[i+1][j]=C[i][(j+LS[i])%28];
D[i+1][j]=D[i][(j+LS[i])%28];
}
for(j=0;j<56;j++)
{
if(j<28)
CD[i+1][j]=C[i+1][j];
else CD[i+1][j]=D[i+1][j-28];
}
for(j=0;j<48;j++)
SubKey[i][j]=CD[i+1][PC_2[j/6][j%6]-1];
cout<<"第"<<i+1<<"轮的子密钥是: ";
for(j=0;j<48;j++)
cout<<SubKey[i][j];
cout<<endl<<endl;
}//子密钥产生过程,已验证正确
}
void Function(bool Right[32],int x)
{
int i,j,m,n,y[8]={0};
bool E[16][48]={0},Bef_SBox[8][6]={0},Out_SBox[16][32]={0},a[4]={0};
for(i=0;i<48;i++)
E[x][i]=Right[E_Table[i/6][i%6]-1];//已验证
for(i=0;i<8;i++)
for(j=0;j<6;j++)
{
Bef_SBox[i][j]=XOR(E[x][6*i+j],SubKey[x][6*i+j]);
}
for(m=0;m<8;m++)//已验证正确
{
y[m]=S_Box[m][2*Bef_SBox[m][0]+Bef_SBox[m][5]][8*Bef_SBox[m][1]+4*Bef_SBox[m][2]+2*Bef_SBox[m][3]+Bef_SBox[m][4]];
Binary2(y[m],a);//y[m]是S盒对应的数
for(n=0;n<4;n++)
Out_SBox[x][m*4+n]=a[n];
}
for(i=0;i<32;i++)//正确
Fun[x][i]=Out_SBox[x][P_Table[i/4][i%4]-1];
}
void Function2(bool Left[32],int x)
{
int i,j,m,n,y[8]={0};
bool E[16][48]={0},Bef_SBox[8][6]={0},Out_SBox[16][32]={0},a[4]={0};
for(i=0;i<48;i++)
E[x][i]=Left[E_Table[i/6][i%6]-1];
for(i=0;i<8;i++)
for(j=0;j<6;j++)
{
Bef_SBox[i][j]=XOR(E[x][6*i+j],SubKey[15-x][6*i+j]);
}
for(m=0;m<8;m++)//已验证正确
{
y[m]=S_Box[m][2*Bef_SBox[m][0]+Bef_SBox[m][5]][8*Bef_SBox[m][1]+4*Bef_SBox[m][2]+2*Bef_SBox[m][3]+Bef_SBox[m][4]];
Binary2(y[m],a);
for(n=0;n<4;n++)
Out_SBox[x][m*4+n]=a[n];
}
for(i=0;i<32;i++)//正确
Fun2[x][i]=Out_SBox[x][P_Table[i/4][i%4]-1];
}
void Encode()
{
int i,j;
bool Bef_IP_1[64]={0};//通过IP_1之前
for(i=0;i<8;i++)
for(j=0;j<8;j++)
Text_IP[i][j]=Text[IP[i][j]-1];
for(i=0;i<8;i++)
for(j=0;j<8;j++)
{
if(i*8+j<32)
L[0][8*i+j]=Text_IP[i][j];
else R[0][8*i+j-32]=Text_IP[i][j];
}//已验证正确
for(i=0;i<16;i++)//已验证循环1
{
Function(R[i],i);//产生子密钥函数
for(j=0;j<32;j++)
{
L[i+1][j]=R[i][j];
R[i+1][j]=XOR(L[i][j],Fun[i][j]);
}
}
for(i=0;i<64;i++)
{
if(i<32)
Bef_IP_1[i]=R[16][i];
else Bef_IP_1[i]=L[16][i-32];
}
for(i=0;i<64;i++)
{
Ciphertext[i]=Bef_IP_1[IP_1[i/8][i%8]-1];
}
cout<<"***************************************************************************************"<<endl<<endl;
cout<<"加密过程的子密钥函数:";
cout<<endl;
for(i=0;i<16;i++)
{
cout<<endl;
cout<<"第"<<i+1<<"轮的加密子密钥函数是:";
for(j=0;j<32;j++)
{
cout<<Fun[i][j];
}
cout<<endl;
}
cout<<endl;
for(i=0;i<17;i++)
{
cout<<"L"<<i<<"为"<<":";
for(j=0;j<32;j++)
cout<<L[i][j];
cout<<" ";
cout<<"R"<<i<<"为"<<":";
for(j=0;j<32;j++)
cout<<R[i][j];
cout<<endl<<endl;
}
cout<<"加密后的密文是:";
for(i=0;i<64;i++)
{
cout<<Ciphertext[i];
if((i+1)%8==0)
cout<<" ";
}
cout<<endl;
}
void Decode()
{
int i,j;
bool Af_IP[64]={0},Bef_IP_1[64]={0};
for(i=0;i<64;i++)
{
Af_IP[i]=Ciphertext[IP[i/8][i%8]-1];
}
for(i=0;i<64;i++)
{
if(i<32)
DeL[0][i]=Af_IP[i];
else DeR[0][i-32]=Af_IP[i];
}
for(i=0;i<16;i++)
{
Function2(DeR[i],i);//解密时产生子密钥函数
for(j=0;j<32;j++)
{
DeL[i+1][j]=DeR[i][j];
DeR[i+1][j]=XOR(DeL[i][j],Fun2[i][j]);
}
}
for(i=0;i<64;i++)
{
if(i<32)
Bef_IP_1[i]=DeR[16][i];
else Bef_IP_1[i]=DeL[16][i-32];
}
cout<<"***************************************************************************************"<<endl<<endl;
cout<<"解密过程的子密钥函数:";
cout<<endl;
for(i=0;i<16;i++)
{
cout<<endl;
cout<<"第"<<i+1<<"轮的解密子密钥函数是:";
for(j=0;j<32;j++)
{
cout<<Fun2[i][j];
}
cout<<endl;
}
cout<<endl;
for(i=0;i<17;i++)
{
cout<<"L"<<i<<"为"<<":";
for(j=0;j<32;j++)
cout<<DeL[i][j];
cout<<" ";
cout<<"R"<<i<<"为"<<":";
for(j=0;j<32;j++)
cout<<DeR[i][j];
cout<<endl<<endl;
}
cout<<"解密后的明文是:";
for(i=0;i<64;i++)
{
Plaintext[i]=Bef_IP_1[IP_1[i/8][i%8]-1];
cout<<Plaintext[i];
if((i+1)%8==0)
cout<<" ";
}
cout<<endl;
}
void OutputCiphertext()//输出密文到Ciphertext.txt文件中
{
int i,Out[16];
FILE *fp;
for(i=0;i<16;i++)
{
Out[i]=8*Ciphertext[4*i]+4*Ciphertext[4*i+1]+2*Ciphertext[4*i+2]+Ciphertext[4*i+3];
}
fp=fopen("Ciphertext.txt","wb+");
if(fp==NULL)
{
printf("Cannot open the file!\0");
exit(0);
}
for(i=0;i<16;i++)
fprintf(fp,"%d",Out[i]);
}
void OutputPlaintext()//输出解密后的明文到Plaintext.txt中
{
int i,Out[16];
FILE *fp;
for(i=0;i<16;i++)
{
Out[i]=8*Plaintext[4*i]+4*Plaintext[4*i+1]+2*Plaintext[4*i+2]+Plaintext[4*i+3];
}
fp=fopen("Plaintext.txt","wb+");
if(fp==NULL)
{
printf("Cannot open the file!\0");
exit(0);
}
for(i=0;i<16;i++)
fprintf(fp,"%d",Out[i]);
}
void main()
{
InitRead();//从文件中读入数据
cout<<endl<<endl;
InitKey();//将密文转化成二进制
MakeSubKey();//产生子密钥
cout<<endl;
Encode();//加密过程
Decode();//解密过程
cout<<endl;
OutputCiphertext();//输出密文,格式为Ciphertext.txt
OutputPlaintext();//输出解密后的明文,格式为Plaintext.txt
cout<<"注:原始明文和密钥是从当前文件夹里InitPlaintext.txt和Key.txt中读入的,产生的密文和解密后"<<endl<<endl<<"的明文分别在Ciphertext.txt和Plaintext.txt文本文档中"<<endl<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -