📄 des.cpp
字号:
#include "StdAfx.h"
#include ".\des.h"
// static initilize
//
const BYTE CDES::m_PermutedKey[56]=
{
57,49,41,33,25,17,9,
1,58,50,42,34,26,18,
10,2,59,51,43,35,27,
19,11,3,60,52,44,36,
63,55,47,39,31,23,15,
7,62,54,46,38,30,22,
14,6,61,53,45,37,29,
21,13,5,28,20,12,4
};
const BYTE CDES::m_Permutedkey48[48]=
{
14,17,11,24,1,5,
3,28,15,6,21,10,
23,19,12,4,26,8,
16,7,27,20,13,2,
41,52,31,37,47,55,
30,40,51,45,33,48,
44,49,39,56,34,53,
46,42,50,36,29,32
};
const BYTE CDES::m_PermutedData[64]=
{
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7
};
const BYTE CDES::m_KeyShift[16]=
{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
const BYTE CDES::m_ExR48[48]=
{
32,1,2,3,4,5,
4,5,6,7,8,9,
8,9,10,11,12,13,
12,13,14,15,16,17,
16,17,18,19,20,21,
20,21,22,23,24,25,
24,25,26,27,28,29,
28,29,30,31,32,1
};
const BYTE CDES::m_CombPermutedData[32]=
{
16,7,20,21,
29,12,28,17,
1,15,23,26,
5,18,31,10,
2,8,24,14,
32,27,3,9,
19,13,30,6,
22,11,4,25
};
const BYTE CDES::m_PermutedInvert[64]=
{
40,8,48,16,56,24,64,32,
39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25
};
const BYTE CDES::m_SubstitutionBox[8][4][16]=
{
{
{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},
{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},
{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},
{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}
},
{
{15, 1 ,8, 14, 6 ,11, 3 ,4 ,9, 7, 2 ,13 ,12 ,0 ,5 ,10},
{3, 13, 4, 7, 15, 2, 8 ,14 ,12 ,0 ,1 ,10 ,6, 9 ,11, 5},
{0, 14 ,7 ,11 ,10 ,4 ,13, 1, 5, 8 ,12, 6 ,9, 3, 2, 15},
{13, 8, 10 ,1 ,3, 15, 4, 2 ,11, 6, 7, 12 ,0, 5 ,14 ,9}
},
{
{10, 0 ,9 ,14 ,6 ,3 ,15, 5, 1, 13, 12, 7, 11 ,4 ,2 ,8},
{13, 7, 0, 9 ,3 ,4 ,6 ,10 ,2 ,8, 5, 14, 12, 11, 15, 1},
{13, 6, 4, 9, 8 ,15, 3, 0 ,11, 1, 2, 12, 5, 10 ,14, 7},
{1, 10, 13, 0 ,6, 9, 8, 7 ,4 ,15 ,14 ,3 ,11, 5 ,2 ,12}
},
{
{7 ,13, 14, 3, 0, 6, 9 ,10 ,1, 2 ,8 ,5 ,11 ,12 ,4 ,15},
{13 ,8, 11, 5 ,6 ,15, 0 ,3 ,4, 7, 2, 12 ,1 ,10 ,14, 9},
{10, 6 ,9, 0 ,12, 11, 7, 13, 15 ,1, 3 ,14, 5 ,2, 8, 4},
{3, 15 ,0, 6 ,10, 1 ,13 ,8 ,9, 4, 5 ,11, 12 ,7 ,2 ,14}
},
{
{ 2, 12, 4, 1, 7, 10 ,11, 6, 8, 5, 3 ,15, 13, 0 ,14 ,9},
{14 ,11, 2 ,12 ,4, 7 ,13, 1, 5 ,0, 15 ,10 ,3, 9, 8, 6},
{4 ,2, 1, 11, 10 ,13, 7 ,8, 15, 9 ,12, 5, 6, 3, 0 ,14},
{11, 8, 12, 7 ,1 ,14, 2 ,13 ,6 ,15, 0 ,9 ,10, 4, 5 ,3}
},
{
{ 12, 1 ,10, 15, 9, 2, 6, 8, 0 ,13, 3 ,4, 14, 7, 5 ,11},
{10, 15, 4, 2, 7 ,12, 9, 5, 6, 1, 13, 14, 0 ,11 ,3, 8},
{9 ,14 ,15, 5, 2, 8 ,12, 3 ,7 ,0, 4 ,10 ,1, 13 ,11, 6},
{4, 3, 2, 12, 9 ,5, 15 ,10, 11 ,14 ,1 ,7, 6 ,0 ,8 ,13}
},
{
{4, 11, 2 ,14, 15 ,0 ,8 ,13 ,3 ,12 ,9, 7, 5, 10 ,6 ,1},
{13, 0 ,11 ,7 ,4 ,9 ,1 ,10, 14, 3, 5 ,12, 2 ,15 ,8, 6},
{1 ,4 ,11 ,13, 12, 3 ,7 ,14, 10,15 ,6 ,8 ,0, 5 ,9, 2},
{6 ,11 ,13, 8 ,1,4 ,10 ,7 ,9 ,5 ,0 ,15 ,14, 2 ,3, 12}
},
{
{13, 2 ,8 ,4 ,6 ,15 ,11, 1 ,10 ,9 ,3 ,14, 5 ,0 ,12, 7},
{1 ,15, 13 ,8, 10, 3, 7, 4 ,12, 5, 6, 11, 0 ,14, 9, 2},
{7, 11, 4, 1, 9 ,12 ,14, 2, 0, 6, 10 ,13, 15, 3 ,5, 8},
{2 ,1 ,14 ,7, 4 ,10 ,8, 13, 15 ,12 ,9, 0, 3 ,5 ,6 ,11}
}
};
CDES::CDES(void):
m_FilePath(_T("")),
m_FileType(_T(""))
{
m_hWnd=NULL;
m_OperateFile=new COperateFile();
m_Key64=0;
m_Data=0;
m_Result=0;
m_progress=0;
m_difPro=0;
for (int i=0;i<18;i++)
{ m_Key48[17]=0;
LDATA[17]=RDATA[17]=0;
}
}//end function
CDES::~CDES(void)
{
delete m_OperateFile;
}
double CDES::GetProgress()
{
return (double)m_progress/m_OperateFile->m_ReadNum;
}
inline BOOL CDES::Permuted(INT i,ULONGLONG& refData,BYTE* shift)
{
if(i<=0) return false;
ULONGLONG tmpP=0;
for (int j=0;j<i;j++)
{
tmpP|=(((refData<<(shift[j]-1))&0X8000000000000000)>>j);
}
refData=tmpP;
return true;
}
inline BOOL CDES::Permuted(INT i,ULONG& refData,BYTE* shift)
{
if(i<=0) return false;
ULONG tmpP=0x0;
for (int j=0;j<i;j++)
{
tmpP=tmpP&(((refData<<(shift[j]-1))&0x80000000)>>j);
}
refData=tmpP;
return true;
}
BOOL CDES::ProcessKey()
{
this->Permuted(56,(ULONGLONG&)m_Key64,(BYTE*)m_PermutedKey);
register C28,D28,TMPC28,TMPD28;
C28=D28=TMPC28=TMPD28=0;
TMPC28=C28=(ULONG) ((m_Key64&0xfffffff000000000)>>32);
TMPD28=D28=(ULONG) ((m_Key64&0x0000000fffffff00)>>4);
for(int i=1;i<17;i++)
{
ULONGLONG CD56=0;
TMPC28=(ULONG)(C28<<m_KeyShift[i-1]);
TMPD28=(ULONG)(D28<<m_KeyShift[i-1]);
ULONGLONG TMPC56=TMPC28;
ULONGLONG TMPD56=TMPD28;
CD56=(ULONGLONG) ((TMPC56<<32)|(TMPD56<<4));//left 56
Permuted(48,(ULONGLONG&)CD56,(BYTE*)m_Permutedkey48);
m_Key48[i]=CD56;
}
return TRUE;
}
BOOL CDES::ProcessData(BOOL DOE)
{
this->Permuted(64,(ULONGLONG&)m_Data,(BYTE*)m_PermutedData);//Initial Permutation (IP)
this->LDATA[0]=(ULONG)(m_Data>>32);
this->RDATA[0]=(ULONG)m_Data;
ULONGLONG ExR48,TMPB64;
ExR48=TMPB64=0;
BYTE B[8];
INT M,N;
M=N=0;
register DATA32=0;
for(int k=0;k<8;k++)
B[k]=0;
for(int i=1;i<17;i++)
{
ExR48=RDATA[i-1];
ExR48=ExR48<<32;
Permuted(48,(ULONGLONG&)ExR48,(BYTE*)m_ExR48);
if(DOE)//加密或解密
TMPB64=ExR48^m_Key48[i];
else TMPB64=ExR48^m_Key48[17-i];
B[0]=(BYTE)(TMPB64&0xFC00000000000000)>>56;
B[1]=(BYTE)(TMPB64&0x03F0000000000000)>>52;
B[2]=(BYTE)(TMPB64&0x000FC00000000000)>>44;
B[3]=(BYTE)(TMPB64&0x00003F0000000000)>>40;
B[4]=(BYTE)(TMPB64&0x000000FC00000000)>>32;
B[5]=(BYTE)(TMPB64&0x00000003F0000000)>>28;
B[6]=(BYTE)(TMPB64&0x000000000FC00000)>>20;
B[7]=(BYTE)(TMPB64&0x00000000003F0000)>>16;
for(int j=0;j<8;j++)
{
M=(BYTE)((B[j]&0x80)>>6)|(BYTE)((B[j]&0x04)>>2);//1,6
N=(BYTE) ((B[j]&0x78)>>3);//2-5
B[j]=m_SubstitutionBox[j][M][N];
register TMPB=B[j];
DATA32=DATA32|(TMPB<<(4*(7-j))) ;
Permuted(32,(ULONG&)DATA32,(BYTE*)m_CombPermutedData);
}
RDATA[i]=DATA32^LDATA[i-1] ;
LDATA[i]=RDATA[i-1];
}
m_Result=RDATA[16];
m_Result=m_Result<<32;
m_Result=m_Result|LDATA[16];
this->Permuted(64,(ULONGLONG&)m_Result,(BYTE*)m_PermutedInvert);
return true;
}
INT CDES::EncryptFile()
{
if(m_OperateFile->OpenFile(this->m_FilePath,true,this->m_FileType)==-3)
return -3;
this->m_Data=this->m_Key64;
this->ProcessKey();
this->ProcessData(true);
m_OperateFile->SetKey(this->m_Result);
m_OperateFile->WriteFileHead();
//处理密码
m_progress=0;
INT result=0;
INT old=0;
INT now=0;
while(true)
{ //处理实际数据
result=m_OperateFile->ReadData(false);
if( result==0)
break;
switch (result)
{
case 100000:
for(int i=0;i<100000;i++)
{
this->m_Data=m_OperateFile->GetData(i);
this->ProcessData(true);
m_OperateFile->SetData(i,this->m_Result);
m_progress++;
now=this->GetProgress()*100;
if (now-old>=1)
{
SendMessage(this->m_hWnd,WM_DEFINE_POS,1,0);
old=now;
m_difPro= m_progress;
}
}
m_OperateFile->SaveDesFile(true,0,100000);
break;
case 8:
this->m_Data=m_OperateFile->GetData();
this->ProcessData(true);
m_OperateFile->SetData(-1,this->m_Result);
m_progress++;
m_OperateFile->SaveDesFile(true,0,0);
now=this->GetProgress()*100;
if (now-old>=1)
{
SendMessage(this->m_hWnd,WM_DEFINE_POS,0,0);
m_difPro= m_progress;
old=now;
}
break;
}
}
m_OperateFile->CloseFile(true);
m_OperateFile->CloseFile(false);
m_OperateFile->DeleteFile(this->m_FilePath);
return 0;
}
INT CDES::DecryptFile()
{
switch(m_OperateFile->OpenFile(this->m_FilePath,false,this->m_FileType))
{
case 0:
break;
case -1:
return -1;//文件格式不对
case -3:
return -3;//文件 打开错误
}
ULONGLONG tmpKey=this->m_Key64;
this->ProcessKey();//生成key
if(m_OperateFile->ReadData(true)!=8)
{
m_OperateFile->CloseFile(true);
m_OperateFile->CloseFile(false);
CFile::Remove(this->m_FilePath);
return -1;//文件不对
}
this->m_Data=m_OperateFile->GetData();//得到密码 密文
::TRACEHEX("key read",this->m_Data);
this->ProcessData(false);//解密密码
if(this->m_Result!=tmpKey)
{
::TRACEHEX("key input",tmpKey);
::TRACEHEX("key after de",this->m_Result);
CString str=this->m_FilePath;
str.Truncate(str.GetLength()-4);
m_OperateFile->CloseFile(true);
m_OperateFile->CloseFile(false);
CFile::Remove(str);
return -2;//密码错误
}
m_progress=0;
INT result=0;
INT old=0;
INT now=0;
while(true)
{
result=m_OperateFile->ReadData(false);
if(result==0) break;
switch(result)
{
case 100000:
for(int i=0;i<100000;i++)
{
this->m_Data=m_OperateFile->GetData(i);
this->ProcessData(false);
m_OperateFile->SetData(i,this->m_Result);
m_progress++;
now=this->GetProgress()*100;
if (now-old>=1)
{
SendMessage(this->m_hWnd,WM_DEFINE_POS,1,0);
old=now;
m_difPro= m_progress;
}
}
m_OperateFile->SaveDesFile(false,0,100000);
break;
case 8:
this->m_Data=m_OperateFile->GetData();
this->ProcessData(false);
m_OperateFile->SetData(-1,this->m_Result);
m_progress++;
m_OperateFile->SaveDesFile(false,m_progress,0);
now=this->GetProgress()*100;
if (now-old>=1)
{
SendMessage(this->m_hWnd,WM_DEFINE_POS,0,0);
old=now;
m_difPro= m_progress;
}
break;
}
}
m_OperateFile->CloseFile(true);
m_OperateFile->CloseFile(false);
m_OperateFile->DeleteFile(this->m_FilePath);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -