📄 viewdlg.cpp
字号:
//密钥产生函数
void CViewDlg::code(int code_code[64],int K[][48],int C1[28],int C2[28])
{
int C[28],D[28];
int tempC = 0,tempD = 0;
int Union[56];
int i=0,j=0;
for(i=0;i<28;i++)
{
C[i] = code_code[C1[i]-1]; // 两者的下标都是从1~64
D[i] = code_code[C2[i]-1];
}
for(i=0;i<16;i++)
{
//实现循环移位
for(j=0;j<W[i];j++)
{
tempC = C[0];
tempD = D[0];
for(int k=0;k<27;k++)
{
C[k] = C[k+1];
D[k] = D[k+1];
}
C[27] = tempC;
D[27] = tempD;
}
//将循环移位后的两个数组联合起来,进行置换选择2
for(j=0;j<28;j++)
Union[j] = C[j];
for(j =28;j<56;j++)
Union[j] = D[j-28];
//进行置换选择2
for(j=0;j<48;j++)
K[i][j] = Union[IP2[j]-1]; //置换选择2数组的元素下标从1~56
}
}
//加密操作
//在加密的过程中都是以64个字符串为一个变换单位进行的,所以读取到的字符必须以64个为一个处理单元
void CViewDlg::permute(int bin[64],int L[32],int R[32],int IP[64])
{
for(int i=0;i<32;i++)
{
L[i]=bin[IP[i]-1]; //IP数组的下标是从1~64之间
R[i]=bin[IP[32+i]-1];
}
}
void CViewDlg::encrypt(int Result_IP[],int IP_athwart[],int K[][48],int E[],int R[],int L[],int S[][4][16])
{
int In[48]; //记录经过选择运算E之后的数列
int Mid[48]; //记录中间输入S盒的48位数列
int Out[32]; //经过整个S盒之后产生的二进制数列
int temp[4]; //经过每个S盒之后产生的二进制数列
int Result[32]; //记录R与K加密后输出的32位加密结果
int Result_mid[64]; //记录经过16次迭代之后的64位密文(未进行逆初始置换)
int i=0,j=0;
int L_Code[32];
int R_Code[32];
// int Result_IP[64]; //记录最后的密文输出(已进行逆初始置换)
//选择运算,产生48位的中间结果
//进行迭代16次
for(i=0;i<16;i++) //进行15次迭代,因为最后一次的迭代的情况略有不同
{
int count_s = 0;
int count_o = 0;
//48位中间结果与48位密钥进行模2加,得到48为输入数组
for(j=0;j<48;j++)
{
Mid[j] = (R[E[j]-1]+K[i][j])%2;
}
//将48位数据输入到8个S盒中进行置换选择,得到32位的输出
for(j=0;j<48;j=j+6)
{
int row = Mid[j]*2+Mid[j+5];
int col = Mid[j+1]*8+Mid[j+2]*4+Mid[j+3]*2+Mid[j+4];
int num = S[count_s++][row][col]; //得到对应的4位输出
convert(temp,num);
for(int k=0;k<4;k++)
{
Out[count_o] = temp[3-k];
count_o++;
}
}
for(j=0;j<32;j++)
{
L_Code[j]=L[j];
R_Code[j]=R[j];
L[j] = R[j];
R[j] = (Out[P[j]-1] + L_Code[j]) % 2; //迭代一次完成
}
}
for(i=0;i<32;i++)
{
Result_mid[i]=R[i];
Result_mid[32+i] = L[i];
}
//进行逆初始置换,输出最后的64位明文
for(i=0;i<64;i++)
Result_IP[i] = Result_mid[IP_athwart[i]-1];
}
//解密操作
void CViewDlg::Unpermute(int bin[64],int L[32],int R[32])
{
int temp[64];
for(int i=0;i<64;i++)
temp[i]=bin[i];
for(i=0;i<64;i++)
bin[IP_athwart[i]-1] = temp[i];
for(i=0;i<32;i++)
R[i]=bin[i]; //IP数组的下标是从1~64之间
for(int j=32;j<64;j++)
L[j-32]=bin[j];
}
void CViewDlg::Unencrypt(int Result_IP[],int K[][48],int E[],int R[],int L[],int S[][4][16])
{
int In[48]; //记录经过选择运算E之后的数列
int Mid[48]; //记录中间输入S盒的48位数列
int Out[32]; //经过整个S盒之后产生的二进制数列
int temp[4]; //经过每个S盒之后产生的二进制数列
int Result[32]; //记录R与K加密后输出的32位加密结果
int Result_mid[64]; //记录经过16次迭代之后的64位密文(未进行逆初始置换)
int i=0,j=0;
int L_Code[32];
int R_Code[32];
// int temp_last[64];
// int Result_IP[64]; //记录最后的密文输出(已进行逆初始置换)
//选择运算,产生48位的中间结果
//进行迭代16次
for(i=0;i<16;i++) //进行15次迭代,因为最后一次的迭代的情况略有不同
{
int count_s = 0;
int count_o = 0;
for(j=0;j<48;j++)
In[j] = L[E[j]-1];
//48位中间结果与48位密钥进行模2加,得到48为输入数组
for(j=0;j<48;j++)
Mid[j] = (In[j]+K[i][j])%2;
//将48位数据输入到8个S盒中进行置换选择,得到32位的输出
for(j=0;j<48;j=j+6)
{
int row = Mid[j]*2+Mid[j+5];
int col = Mid[j+1]*8+Mid[j+2]*4+Mid[j+3]*2+Mid[j+4];
int num = S[count_s++][row][col]; //得到对应的4位输出
convert(temp,num);
for(int k=0;k<4;k++)
{
Out[count_o] = temp[3-k];
count_o++;
}
}
//进行P置换
for(j=0;j<32;j++)
Result[j] = Out[P[j]-1]; //得到置换运算P之后的结果
for(j=0;j<32;j++)
{
L_Code[j]=L[j];
R_Code[j]=R[j];
R[j] = L[j];
L[j] = (Result[j] + R_Code[j]) % 2; //迭代一次完成
}
}
for(i=0;i<32;i++)
Result_mid[i]=L[i];
for(i=32;i<64;i++)
Result_mid[i] = R[i-32];
//进行逆初始置换,输出最后的64位明文
for(i=0;i<64;i++)
Result_IP[IP_IP[i]-1] = Result_mid[i];
}
//以此完整的加密过程
void CViewDlg::code_all(CFile fp_ming,CFile fp_code,char code_char[])
{
char Ming[SIZE*8];
char char_array[SIZE*8];
int i=0;
int j=0;
UINT count=0; //记载读取的字符数
int count_time=0;
char my_array[SIZE];
int code_int[64];
int cut=0;
char short_cut[8];
long time=0;
long time_count=0;
charTint(code_char,code_int);
code(code_int,K_Code,C1,C2); //产生密钥
fp_ming.SeekToBegin();
fp_code.SeekToBegin();
long len = fp_ming.GetLength();
time=len/1024;
while(time_count<=time)
{
count = fp_ming.Read(my_array,SIZE);
for(j=0;j<64;j++)
Z[j]=Z_1[j];
if(count<SIZE)
count_time=(count/8)*8;
else
count_time=SIZE;
for(int x=0;x<count_time;x=x+8)
{
for(j=0;j<8;j++)
char_Uncode[j] = my_array[x+j];
charTint(char_Uncode,bin_Uncode);
for(j=0;j<64;j++)
bin_Uncode[j]=(bin_Uncode[j]+Z[j])%2;
//加密操作
permute(bin_Uncode,L,R,IP_IP);
encrypt(Result_IP,IP_athwart,K_Code,E,R,L,S);
for(j=0;j<64;j++)
{
if(Result_IP[j])
Ming[8*x+j]='1';
else
Ming[8*x+j]='0';
Z[j]=Result_IP[j]; //计算下一次的反馈数组
}
}
fp_code.Write(Ming,count_time*8);
time_count++;
if(count_time<count)
{
cut=1;
break;
}
}
if(cut==1)
{
fp_ming.Seek(-8,CFile::end);
fp_ming.Read(short_cut,8);
charTint(short_cut,bin_Uncode);
for(i=0;i<8*(8-count%8);i++)
bin_Uncode[i]=Result_IP[8*(count%8)+i];
permute(bin_Uncode,L,R,IP_IP);
encrypt(Result_IP,IP_athwart,K_Code,E,R,L,S);
for(j=0;j<64;j++)
{
if(Result_IP[j])
Ming[j]='1';
else
Ming[j]='0'; //计算下一次的反馈数组
}
int n=8*(count%8)-64;
fp_code.Seek(n,CFile::end);
fp_code.Write(Ming,64);
}
}
//以此完整的解密过程
void CViewDlg::uncode_all(CFile fp_ming,CFile fp_code,char code_char[])
{
char Ming[SIZE*8];
char char_array[SIZE*8];
int i=0;
int j=0;
char test[8];
int code_int[64];
int count=0; //记载读取的字符数
int count_time=0;
char my_array[SIZE+8];
int temp[64];
int y=0;
int cut=0;
char char_Uncode[64];
char short_cut[8];
char cut_short[8];
long len,time=0;
long time_count=0;
charTint(code_char,code_int);
code(code_int,K_Code,C1,C2);
for(i=0;i<16;i++)
for(int j=0;j<48;j++)
K_Uncode[i][j] = K_Code[15-i][j];
fp_ming.SeekToBegin();
fp_ming.SeekToBegin();
if( (len = fp_ming.GetLength())%64 != 0)
{
fp_ming.Seek(-64,CFile::end);
fp_ming.Read(char_array,64);
for(i=0;i<64;i++)
{
if(char_array[i]=='0')
bin_Uncode[i]=0;
else
bin_Uncode[i]=1;
}
Unpermute(bin_Uncode,L,R);
Unencrypt(Result_IP,K_Uncode,E,R,L,S); //得到短块处理结果
intTchar(Result_IP,short_cut);
for(i=0;i<64;i++)
{
if(Result_IP[i]==0)
Ming[i]='0';
else
Ming[i]='1';
}
fp_ming.Seek(-64,CFile::end);
fp_ming.Write(Ming,64);
for(i=0;i<(len%64)/8;i++)
cut_short[i]=short_cut[8-(len%64)/8+i];
}
fp_ming.SeekToBegin();
time=len/(SIZE*8);
while(time_count<=time)
{
y=0;
count = fp_ming.Read(char_array,8*SIZE);
for(j=0;j<64;j++)
Z[j]=Z_1[j];
if(count<8*SIZE)
count_time=(count/64)*64;
else
count_time=8*SIZE;
for(int x=0;x<count_time;x=x+64)
{
for(j=0;j<64;j++)
{
if(char_array[x+j]=='1')
bin_Uncode[j]=1;
else
bin_Uncode[j]=0;
temp[j]=bin_Uncode[j];
}
Unpermute(bin_Uncode,L,R);
Unencrypt(Result_IP,K_Uncode,E,R,L,S);
for(j=0;j<64;j++)
{
Result_IP[j]=(Result_IP[j]+Z[j])%2;
Z[j]=temp[j];
}
intTchar(Result_IP,ch_code); //将加密之后的二进制数组转换为字符串输出
for(j=0;j<8;j++)
{
my_array[y]=ch_code[j];
y++;
}
}
fp_code.Write(my_array,count_time/8);
time_count++;
if(count>count_time)
{
cut=1;
break;
}
}
if(cut==1)
{
for(i=0;i<(count-count_time)/8;i++)
my_array[count_time/8+i]=cut_short[i];
fp_code.Seek(-count_time/8,CFile::end);
fp_code.Write(my_array,(count-count_time)/8+count_time/8);
}
}
//完成预览文件功能
void CViewDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString strFileName;
char szFilter[200];
strcpy( szFilter, "TXT Files (*.*)|*.*||" );
CFileDialog *pFileDialog;
pFileDialog = new CFileDialog( TRUE,
NULL,
NULL,
OFN_HIDEREADONLY,
szFilter,
this );
if(IDOK == pFileDialog->DoModal())
{
strFileName = pFileDialog->GetPathName();
m_editName.SetWindowText(strFileName);
}
}
void CViewDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
CString strFileName;
char szFilter[200];
strcpy( szFilter, "TXT Files (*.*)|*.*||" );
CFileDialog *pFileDialog;
pFileDialog = new CFileDialog( TRUE,
NULL,
NULL,
OFN_HIDEREADONLY,
szFilter,
this );
if(IDOK == pFileDialog->DoModal())
{
strFileName = pFileDialog->GetPathName();
m_editFile.SetWindowText(strFileName);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -