📄 desencrptiondlg.cpp
字号:
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;
}
}
}
CString CDESEncrptionDlg::BtoS(bool b[],int length) //把bool数组转换成十六进制串
{
CString result="";
int temp;
int sum=0;
unsigned char tempc;
for(int i=0;i<length;i+=4)
{
sum=0;
tempc=0;
for(int j=0;j<4;j++)
{
temp=b[i+j];
sum=sum*2+temp;
}
if(sum<10)
tempc=sum+48; //30-------39H
else
tempc=sum+48+7;
result+=tempc;
}
return result;
}
void CDESEncrptionDlg::ShowText() //显示输出的控制函数
{
m_ResultEdit+="L";
char c3[2],c4[2];
CString c1,c2;
c1.Format("%d",(DESRound-2));
c2.Format("%d",(DESRound-1));
m_ResultEdit+=c1;
m_ResultEdit+=": ";
m_ResultEdit+=m_Lold;
m_ResultEdit+=" R";
m_ResultEdit+=c1;
m_ResultEdit+=": ";
m_ResultEdit+=m_Rold;
m_ResultEdit+="\r\n";
m_ResultEdit+="K";
m_ResultEdit+=c2;
m_ResultEdit+=": ";
m_ResultEdit+=m_K;
m_ResultEdit+="\r\n";
m_ResultEdit+="ER: ";
m_ResultEdit+=m_ER;
m_ResultEdit+="\r\n";
m_ResultEdit+="XOR: ";
m_ResultEdit+=m_XOR;
m_ResultEdit+="\r\n";
m_ResultEdit+="S: ";
m_ResultEdit+=m_S;
m_ResultEdit+="\r\n";
m_ResultEdit+="F: ";
m_ResultEdit+=m_F;
m_ResultEdit+="\r\n";
m_ResultEdit+="L";
m_ResultEdit+=c2;
m_ResultEdit+=": ";
m_ResultEdit+=m_Lnew;
m_ResultEdit+=" R";
m_ResultEdit+=c2;
m_ResultEdit+=": ";
m_ResultEdit+=m_Rnew;
m_ResultEdit+="\r\n\r\n";
m_Lold="";m_Rold="";m_K="";m_ER="";m_XOR="";m_S="";m_F="";
UpdateData(false);
}
void CDESEncrptionDlg::OnLookForCode() //源代码子窗口
{
codeFrame.DoModal();
}
CString CDESEncrptionDlg::getResult(bool b1[],bool b2[],bool b3[]) //得到16轮转换结果的十六进制
{
bool r[64];
for(int i=0;i<32;i++)
{
r[i]=b1[i];
r[i+32]=b2[i];
}
Transfer(ipres,r,b3,64);
return "";
}
void CDESEncrptionDlg::ComputeKey() //计算16个密钥
{
bool b64[64];
bool bForKey[56]; // save the pre key
CString key=m_OutputVar;
Analysis(key,b64,64);
//DecimalToBinary(key,b64,64);
Transfer(PC1,b64,bForKey,56);
for(int i=0;i<16;i++)
{
LeftMove(bForKey,iter[i][1]);
Transfer(PC2,bForKey,bKeys[i],48); //bKeys is two dimensional bool array
//CString s=BtoS(bKeys[i],48);
//MessageBox(s);
}
}
void CDESEncrptionDlg::OnEncrptionButton() //文件加密
{
int len=m_OutputVar.GetLength();
if(m_edit1==""||m_edit2=="")
{
MessageBox("请填好文件路径","警告",1);
}
else if(m_OutputVar=="")
{
MessageBox("请填好密钥","警告",1);
}
else if(len<16)
{
MessageBox("请填入足够的密钥字符数,至少为16个","警告",1);
}
else
{
ComputeKey();
CFile inFile; //得到文件长度
CFile outFile;
inFile.Open(m_edit1,CFile::modeRead);
outFile.Open(m_edit2,CFile::modeWrite|CFile::modeCreate);
int length=inFile.GetLength();
rest=length%8;
CString temp="";
DWORD dwordl;
DWORD dwordh;
char tempc[8];
char *tryc=new char[16];
clock_t start= clock(); //origin start time
int wholenum=length/8; //利用文件缓冲区来加快速度
//clock_t start= clock();
for(int i=0;i<length/8;i++)
{
wholenum-=512;
if(wholenum>=0)
{
BYTE *tempcc=new BYTE[4096];
inFile.Read(tempcc,4096);
for(int kk=0;kk<512;kk++){
temp="";
for(int j=0;j<8;j++)
{
temp+=tempcc[j+kk*8];
}
CString cs=Encrp(temp);
for(int k=0;k<8;k++)
{
tempcc[k+kk*8]=cs.GetAt(k);
}
}
outFile.Write(tempcc,4096);
i+=511;
delete []tempcc;
}
else //当不够4096个字节时的处理
{
temp="";
inFile.Read(&tempc,8);
for(int j=0;j<8;j++)
{
temp+=tempc[j];
}
//MessageBox(temp);
CString cs=Encrp(temp);
for(int k=0;k<8;k++)
{
tempc[k]=cs.GetAt(k);
//MessageBox(temp,"",1);
}
outFile.Write(&tempc,8);
}
}
if(rest!=0) //处理最后一个64位
{
CString last2;
char tc=0;
for(int i1=0;i1<rest;i1++)
{
inFile.Read(&tc,1);
last2+=tc;
}
for(int j1=0;j1<(8-rest);j1++)
{
tc=0;
last2+=tc;
}
CString cs=Encrp(last2);
for(int k=0;k<8;k++)
{
tempc[k]=cs.GetAt(k);
//MessageBox(temp,"",1);
outFile.Write(&tempc[k],1);
}
}
temp="";
DWORD dw=length;
//DWORD dw1=0;
//cst+=dw1;
temp+=dw;
CString cst=temp;
int tempt=temp.GetLength();
int m;char c=0;temp="";
for(m=0;m<(8-tempt);m++)
{
temp+=c; //记录文件的总长度
}
temp+=cst;
CString cs=Encrp(temp);
for(m=0;m<8;m++)
{
tempc[m]=cs.GetAt(m);
outFile.Write(&tempc[m],1);
}
dw=0;
for(int i2=0;i2<8;i2++)
{
char cr=temp.GetAt(i2);
if(cr==0)
continue;
else
{
dw=dw<<8;
dw+=cr;
}
}
temp=dw;
inFile.Close();
outFile.Close();
clock_t finish= clock();
double totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
totaltime=length/(totaltime*1024*1024*1.0);
CString s;
s.Format("%f",totaltime);
m_speed=s; //origin end time
UpdateData(false);
}
}
void CDESEncrptionDlg::OnDecrptionButton() //文件解密
{
int len=m_OutputVar.GetLength();
if(m_edit2==""||m_edit3=="")
{
MessageBox("请填好文件路径","警告",1);
}
else if(m_OutputVar=="")
{
MessageBox("请填好密钥","warn",4);
}
else if(len<16)
{
MessageBox("请填入足够的密钥字符数,至少为16个","警告",1);
}
else
{
ComputeKey();
CFile inFile; //得到文件长度
CFile outFile;
CFileException e;
inFile.Open(m_edit2,CFile::modeRead,&e);
outFile.Open(m_edit3,CFile::modeWrite|CFile::modeCreate);
int length=inFile.GetLength();
rest=length%8;
CString temp="";
DWORD dwordl;
DWORD dwordh;
char tempc[8];
CString cs1,cs2;
int wholenum=length/8;
clock_t start= clock();
wholenum-=512; //先减掉32,防止对结尾的操作复杂
for(int i=0;i<length/8;i++)
{
wholenum-=512;
if(wholenum>=0) //保证不会遇到文件尾
{
BYTE *tempcc=new BYTE[4096];
inFile.Read(tempcc,4096);
for(int kk=0;kk<512;kk++){
temp="";
for(int j=0;j<8;j++)
{
temp+=tempcc[j+kk*8]; //????????????
}
CString cs=Decrp(temp);
for(int k=0;k<8;k++)
{
tempcc[k+kk*8]=cs.GetAt(k);
}
}
outFile.Write(tempcc,4096);
i+=511;
delete []tempcc;
}
else
{
temp="";
inFile.Read(&tempc,8);
for(int j=0;j<8;j++)
{
temp+=tempc[j];
}
CString cs=Decrp(temp);
if(i==length/8-2) // second to last
{
cs1=cs;
}
else if(i==length/8-1) //last
{
cs2=cs;
}
else
{
for(int k=0;k<8;k++)
{
tempc[k]=cs.GetAt(k);
}
outFile.Write(&tempc,8);
}
}
}
//解析cs2
DWORD dw=0;
for(int i2=0;i2<8;i2++) //得到原文件一共有多少个字节
{
char cr=cs2.GetAt(i2);
if(cr==0)
continue;
else
{
dw=dw<<8;
dw+=cr;
}
}
int len=dw;
if(len%8==0) //如果是八的整数倍
{
for(int k=0;k<8;k++)
{
tempc[k]=cs1.GetAt(k);
outFile.Write(&tempc[k],1);
}
}
else //如果不是8的整数倍
{
int r=len%8;
for(int k1=0;k1<r;k1++)
{
tempc[k1]=cs1.GetAt(k1);
outFile.Write(&tempc[k1],1);
}
}
inFile.Close();
outFile.Close();
clock_t finish= clock();
double totaltime=(double)(finish-start)/CLOCKS_PER_SEC;
totaltime=length/(totaltime*1024*1024*1.0);
CString s;
s.Format("%f",totaltime);
m_speed=s;
UpdateData(false);
}
}
bool bSource[64];
bool bip[64];
bool bLo[32];
bool bRo[32];
bool bLn[32];
bool bRn[32];
bool bERt[48];
bool bXORt[48];
bool bSt[32];
bool bFt[32];
bool bRt[64];
bool bResult[64];
CString CDESEncrptionDlg::Encrp(CString source) //source is 64 bits 加密循环
{
DecimalToBinary(source,bSource,64);
Transfer(ip,bSource,bip,64);
for(int i=0;i<32;i++)
{
bLo[i]=bip[i];
bRo[i]=bip[32+i];
}
for(int round=0;round<16;round++)
{
for(i=0;i<32;i++)
{
bLn[i]=bRo[i];
}
Transfer(E,bRo,bERt,48);
xor48(bKeys[round],bERt,bXORt,48);
sixTofour(bXORt,bSt);
Transfer(P,bSt,bFt,32);
xor48(bLo,bFt,bRn,32);
for(i=0;i<32;i++)
{
bLo[i]=bLn[i];
bRo[i]=bRn[i];
}
}
for(i=0;i<32;i++)
{
bRt[i]=bRo[i];
bRt[i+32]=bLo[i];
}
Transfer(ipres,bRt,bResult,64);
CString output=BS(bResult,64);
return output;
}
CString CDESEncrptionDlg::Decrp(CString source) //解密循环
{
DecimalToBinary(source,bSource,64); //和加密共用 注意!!!!!!!!!
Transfer(ip,bSource,bip,64);
for(int i=0;i<32;i++)
{
bLo[i]=bip[i+32];
bRo[i]=bip[i];
}
for(int round=0;round<16;round++)
{
for(i=0;i<32;i++)
{
bRn[i]=bLo[i];
}
Transfer(E,bLo,bERt,48);
xor48(bKeys[15-round],bERt,bXORt,48);
sixTofour(bXORt,bSt);
Transfer(P,bSt,bFt,32);
xor48(bRo,bFt,bLn,32);
for(i=0;i<32;i++)
{
bLo[i]=bLn[i];
bRo[i]=bRn[i];
}
}
for(i=0;i<32;i++)
{
bRt[i]=bLo[i];
bRt[i+32]=bRo[i];
}
Transfer(ipres,bRt,bResult,64);
CString input=BS(bResult,64);
return input;
}
CString CDESEncrptionDlg::BS(bool source[],int length) //把加密后的转化回CString
{
CString result="";
int sum=0;
for(int i=0;i<length;i+=8)
{
sum=0;
for(int j=0;j<8;j++)
{
//temp=source.GetAt(i+j);
sum=sum*2+source[i+j];
}
result+=sum; //???????????????????????????小心哪
}
return result;
}
bool CDESEncrptionDlg::Analysis(CString strDecimal,bool b[],int l) //解析输入
{
bool sign=true;
CString temps;
unsigned char tempc;
for(int i=0;i<16;i++)
{
tempc=strDecimal.GetAt(i);
switch(tempc)
{
case '0':
b[i*4]=0;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=0;break;
case '1':
b[i*4]=0;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=1;break;
case '2':
b[i*4]=0;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
case '3':
b[i*4]=0;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
case '4':
b[i*4]=0;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
case '5':
b[i*4]=0;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
case '6':
b[i*4]=0;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
case '7':
b[i*4]=0;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
case '8':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=0;break;
case '9':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=0;b[i*4+3]=1;break;
case 'a':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
case 'b':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
case 'c':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
case 'd':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
case 'e':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
case 'f':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
case 'A':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=0;break;
case 'B':
b[i*4]=1;b[i*4+1]=0;b[i*4+2]=1;b[i*4+3]=1;break;
case 'C':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=0;break;
case 'D':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=0;b[i*4+3]=1;break;
case 'E':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=0;break;
case 'F':
b[i*4]=1;b[i*4+1]=1;b[i*4+2]=1;b[i*4+3]=1;break;
default: sign=false; break;
}
}
return sign;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -