📄 desencrptiondlg.cpp
字号:
result=(nDecimal&ruler);
if(result!=0)
{
//temp[j]='1';
boolArray[j+i*8]=1;
}
else
{
//temp[j]='0';
boolArray[j+i*8]=0;
}
ruler=ruler>>1;
//strBinary+=temp[j];
}
}
//bool *trybool[64];
//return strBinary;
}
void CDESEncrptionDlg::Transfer(int array[],bool s[],bool d[],int dimension)
{
int i;
for(i=0;i<dimension;i++)
{
d[i]=s[(array[i]-1)];
}
}
void CDESEncrptionDlg::OnTransferButton()
{
}
void CDESEncrptionDlg::xor48(bool s1[],bool s2[],bool r[],int length)
{
for(int i=0;i<length;i++)
{
if(s1[i]==s2[i])
{
r[i]=0;
}
else
{
r[i]=1;
}
}
}
void CDESEncrptionDlg::sixTofour(bool s[],bool d[])
{
int row;
int column;
int value;
unsigned char tempc;
CString cs;
bool temp[8];
for(int i=0;i<8;i++)
{
row=s[i*6+0]*2+s[i*6+5];
column=s[i*6+1]*8+s[i*6+2]*4+s[i*6+3]*2+s[i*6+4];
value=S[i][row*16+column];
tempc=value;
cs=tempc;
DecimalToBinary(cs,temp,8);
for(int j=0;j<4;j++)
{
d[i*4+j]=temp[j+4];
}
}
}
CString CDESEncrptionDlg::BinaryToDecimal(CString source,int length)
{
CString result="";
CString temp;
int sum=0;
for(int i=0;i<length;i++)
{
temp=source.GetAt(i);
sum=sum*2+atoi(temp);
}
unsigned char tempc=sum;
result=tempc;
return result;
}
void CDESEncrptionDlg::OnChangeKeyEdit()
{
UpdateData(true);
}
void CDESEncrptionDlg::OnIPButton()
{
if(DESRound==1)
{
if(m_InputVar=="")
{
MessageBox("请填好原文","warn",4);
}
else
{
CString cstring;
CString head;
cstring.Format("%d",(DESRound-1));
head="R";
head+=cstring;
ROsign.SetWindowText(head);
head.SetAt(0,'L');
LOsign.SetWindowText(head);
cstring.Format("%d",(DESRound));
head="C";
head+=cstring;
Csign.SetWindowText(head);
head.SetAt(0,'D');
Dsign.SetWindowText(head);
head.SetAt(0,'K');
Ksign.SetWindowText(head);
head.SetAt(0,'L');
LNsign.SetWindowText(head);
head.SetAt(0,'R');
RNsign.SetWindowText(head);
m_ResultEdit="";
UpdateData(false);
bool b64[64];
bool b64dup1[64];
int len=m_InputVar.GetLength();
if(len<16)
{
MessageBox("请输入足够的字符,至少16个","警告",1);
}
else if(!Analysis(m_InputVar,b64,64))
{
MessageBox("对不起,请重新输入有效明文字符!","警告",1);
}
//DecimalToBinary(m_InputVar,b64,64); //temp64 is the 0,1 representation of input
else
{
Transfer(ip,b64,b64dup1,64);
for(int i=0;i<32;i++)
{
bLold[i]=b64dup1[i];
}
for(i=0;i<32;i++)
{
bRold[i]=b64dup1[i+32];
}
m_Lold=BtoS(bLold,32);
m_Rold=BtoS(bRold,32);
UpdateData(false);
m_nextRound.EnableWindow(false); //控制按钮的可控性
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(true);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
}
}
else
{
m_Rold=m_Rnew;
m_Lold=m_Lnew;
for(int i=0;i<32;i++)
{
bLold[i]=bLnew[i];
bRold[i]=bRnew[i];
}
m_Lnew="";m_Rnew="";
m_Round.Format("%d",DESRound);
UpdateData(false);
m_nextRound.EnableWindow(false); //下一轮按钮不可点击
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(true);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
}
void CDESEncrptionDlg::OnLeftButton()
{
if(DESRound==1)
{
if(m_OutputVar=="")
{
MessageBox("请填好密钥","warn",4);
}
else
{
bool b64[64];
CString key=m_OutputVar;
int len=m_OutputVar.GetLength();
if(len<16)
{
MessageBox("请输入足够的字符,至少16个","警告",1);
}
else if(!Analysis(key,b64,64))
{
MessageBox("对不起,请重新输入有效密钥字符!","警告",1);
}
else
{
//DecimalToBinary(key,b64,64);
Transfer(PC1,b64,b64dup,56);
LeftMove(b64dup,iter[DESRound-1][1]);
m_C=""; m_D="";
for(int i=0;i<28;i++)
{
if(b64dup[i]==0)
m_C+="0";
else
m_C+="1";
if(b64dup[i+28]==0)
m_D+="0";
else
m_D+="1";
bCD[i]=b64dup[i];
bCD[i+28]=b64dup[i+28];
}
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(true);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
}
}
else
{
LeftMove(b64dup,iter[DESRound-1][1]);
m_C=""; m_D="";
for(int i=0;i<28;i++)
{
if(b64dup[i]==0)
m_C+="0";
else
m_C+="1";
if(b64dup[i+28]==0)
m_D+="0";
else
m_D+="1";
bCD[i]=b64dup[i];
bCD[i+28]=b64dup[i+28];
}
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(true);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
}
void CDESEncrptionDlg::OnPC2Button()
{
Transfer(PC2,bCD,bK,48);
m_K=BtoS(bK,48);
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(true);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
void CDESEncrptionDlg::OnERButton()
{
Transfer(E,bRold,bER,48); //从R0得到E(R)
m_ER=BtoS(bER,48);
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(true);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
void CDESEncrptionDlg::OnXORButton()
{
xor48(bK,bER,bXOR,48); //得到K1 xor E(R)
m_XOR=BtoS(bXOR,48);
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(true);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
void CDESEncrptionDlg::OnSButton()
{
sixTofour(bXOR,bS); //六变四
m_S=BtoS(bS,32);
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(true);
m_lfxorbutton.EnableWindow(false);
}
void CDESEncrptionDlg::OnPButton()
{
Transfer(P,bS,bF,32); //得到F(R,K)的值
m_F=BtoS(bF,32);
UpdateData(false);
m_ipbutton.EnableWindow(false);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(true);
}
void CDESEncrptionDlg::OnLFXORButton()
{
xor48(bLold,bF,bRnew,32);
for(int i=0;i<32;i++)
{
bLnew[i]=bRold[i];
}
m_Lnew=BtoS(bLnew,32);
m_Rnew=BtoS(bRnew,32);
UpdateData(false);
DESRound++;
m_nextRound.EnableWindow(true);
CString cstring;
CString head;
cstring.Format("%d",(DESRound-1));
head="R";
head+=cstring;
ROsign.SetWindowText(head);
head.SetAt(0,'L');
LOsign.SetWindowText(head);
cstring.Format("%d",(DESRound));
head="C";
head+=cstring;
Csign.SetWindowText(head);
head.SetAt(0,'D');
Dsign.SetWindowText(head);
head.SetAt(0,'K');
Ksign.SetWindowText(head);
head.SetAt(0,'L');
LNsign.SetWindowText(head);
head.SetAt(0,'R');
RNsign.SetWindowText(head);
ShowText();
if(DESRound==17)
{
bool re[64];
getResult(bRnew,bLnew,re);
CString result=BtoS(re,64);
MessageBox(result,"加密结果",1);
m_ResultEdit+="THE FINALL RESULT IS:";
m_ResultEdit+=result;
m_ResultEdit+="\r\n";
m_finalResult=result;
UpdateData(false);
DESRound=1;
}
m_ipbutton.EnableWindow(true);
m_leftbutton.EnableWindow(false);
m_pc2button.EnableWindow(false);
m_erbutton.EnableWindow(false);
m_xorbutton.EnableWindow(false);
m_sbutton.EnableWindow(false);
m_pbutton.EnableWindow(false);
m_lfxorbutton.EnableWindow(false);
}
void CDESEncrptionDlg::OnnextRound() //整体进行一轮加密
{
if(m_InputVar=="")
{
MessageBox("请填好原文","warn",4);
}
else if(m_OutputVar=="")
{
MessageBox("请填好密钥","warn",4);
}
else
{
if(DESRound==1)
{
m_ResultEdit="";
UpdateData(false);
bool b64[64];
bool b64dup1[64];
DecimalToBinary(m_InputVar,b64,64); //temp64 is the 0,1 representation of input
Transfer(ip,b64,b64dup1,64);
for(int i=0;i<32;i++)
{
bLold[i]=b64dup1[i];
}
for(i=0;i<32;i++)
{
bRold[i]=b64dup1[i+32];
}
m_Lold=BtoS(bLold,32);
m_Rold=BtoS(bRold,32);
UpdateData(false);
}
else
{
m_Rold=m_Rnew;
m_Lold=m_Lnew;
for(int i=0;i<32;i++)
{
bLold[i]=bLnew[i];
bRold[i]=bRnew[i];
}
m_Lnew="";m_Rnew="";
m_Round.Format("%d",DESRound);
UpdateData(false);
}
if(DESRound==1)
{
bool b64[64];
CString key=m_OutputVar;
DecimalToBinary(key,b64,64);
Transfer(PC1,b64,b64dup,56);
LeftMove(b64dup,iter[DESRound-1][1]);
m_C=""; m_D="";
for(int i=0;i<28;i++)
{
if(b64dup[i]==0)
m_C+="0";
else
m_C+="1";
if(b64dup[i+28]==0)
m_D+="0";
else
m_D+="1";
bCD[i]=b64dup[i];
bCD[i+28]=b64dup[i+28];
}
UpdateData(false);
}
else
{
LeftMove(b64dup,iter[DESRound-1][1]);
m_C=""; m_D="";
for(int i=0;i<28;i++)
{
if(b64dup[i]==0)
m_C+="0";
else
m_C+="1";
if(b64dup[i+28]==0)
m_D+="0";
else
m_D+="1";
bCD[i]=b64dup[i];
bCD[i+28]=b64dup[i+28];
}
UpdateData(false);
}
Transfer(PC2,bCD,bK,48); //得到K1
m_K=BtoS(bK,48);
UpdateData(false);
Transfer(E,bRold,bER,48); //从R0得到E(R)
m_ER=BtoS(bER,48);
UpdateData(false);
xor48(bK,bER,bXOR,48); //得到K1 xor E(R)
m_XOR=BtoS(bXOR,48);
UpdateData(false);
sixTofour(bXOR,bS); //六变四
m_S=BtoS(bS,32);
UpdateData(false);
Transfer(P,bS,bF,32); //得到F(R,K)的值
m_F=BtoS(bF,32);
UpdateData(false);
xor48(bLold,bF,bRnew,32); //得到R1
for(int i=0;i<32;i++)
{
bLnew[i]=bRold[i];
}
m_Lnew=BtoS(bLnew,32); //得到L1
m_Rnew=BtoS(bRnew,32);
UpdateData(false);
DESRound++;
CString cstring;
CString head;
cstring.Format("%d",(DESRound-1));
head="R";
head+=cstring;
ROsign.SetWindowText(head);
head.SetAt(0,'L');
LOsign.SetWindowText(head);
cstring.Format("%d",(DESRound));
head="C";
head+=cstring;
Csign.SetWindowText(head);
head.SetAt(0,'D');
Dsign.SetWindowText(head);
head.SetAt(0,'K');
Ksign.SetWindowText(head);
head.SetAt(0,'L');
LNsign.SetWindowText(head);
head.SetAt(0,'R');
RNsign.SetWindowText(head);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -