📄 des_youngdlg.cpp
字号:
// DES_youngDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DES_young.h"
#include "DES_youngDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDES_youngDlg dialog
CDES_youngDlg::CDES_youngDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDES_youngDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDES_youngDlg)
m_mingwen = _T("");
m_key = _T("");
m_miwen = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDES_youngDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDES_youngDlg)
DDX_Text(pDX, IDC_EDIT1, m_mingwen);
DDX_Text(pDX, IDC_EDIT2, m_key);
DDX_Text(pDX, IDC_EDIT3, m_miwen);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDES_youngDlg, CDialog)
//{{AFX_MSG_MAP(CDES_youngDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDES_youngDlg message handlers
BOOL CDES_youngDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CDES_youngDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CDES_youngDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDES_youngDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CDES_youngDlg::OnButton1()
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_mingwen="1100000100100011010001010110011110001001101010111100110111101111";
m_key="0001001100110100010101110111100110011011101111001101111111110001";
char temp2[64];
char keyT[56],C[17][28],D[17][28],K1[16][56],K[16][48];
int pc1[56] = {56,48,40,32,24,16,8,0,57,49,41,33,25,17,
9,1,58,50,42,34,26,18,10,2,59,51,43,35,
62,54,46,38,30,22,14,6,61,53,45,37,29,21,
13,5,60,52,44,36,28,20,12,4,27,19,11,3};
int pc2[48] = {13,16,10,23,0,4,2,27,14,5,20,9,
22,18,11,3,25,7,15,6,26,19,12,1,
40,51,30,36,46,54,29,39,50,44,32,47,
43,48,38,55,33,52,45,41,49,35,28,31};
int i,l;
for(i=0;i<56;i++)
{
l=pc1[i];
keyT[i]=m_key[l];
if(i<28)
C[0][i]=keyT[i];
else
D[0][i-28]=keyT[i];
}//置换选择pc-1
int move[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
for(i=0;i<16;i++)
{
l=move[i];//循环左移的位数
for(int j=0;j<28;j++)
{
if(j+l<28)
C[i+1][j]=C[i][j+l];
else
C[i+1][j]=C[i][j-27];
K1[i][j]=C[i+1][j];
}
for(j=0;j<28;j++)
{
if(j+l<28)
D[i+1][j]=D[i][j+l];
else
D[i+1][j]=D[i][j-27];
K1[i][j+28]=D[i+1][j];
}
int m=0;
for(j=0;j<48;j++)
{
int dd;
m=pc2[j];
dd=K1[i][m];
K[i][j]=dd;
}
}//密钥变换全部结束
/*对明文进行处理*/
int ip1[64]={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,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6};
int ip2[64]={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,
32,0,40,8,48,16,56,24};
/*尚未考虑输入不足64位的处理方案*/
char data[64],L[17][32],R[17][32];
for(i=0;i<64;i++)
{
l=ip1[i];
data[i]=m_mingwen[l];
if(i<32)
L[0][i]=data[i];
else
R[0][i-32]=data[i];
}
int Eh[48]={31,0,1,2,3,4,
3,4,5,6,7,8,
7,8,9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31,0};
//开始迭代
for(int t=0;t<16;t++)
{
char R1[8][6];
int k=0;
int j=0;
for(i=0;i<48;i++)
{
int dc;
l=Eh[i];
if(j==6)
{
j=0;
k++;
};
dc=R[t][l];
R1[k][j]=dc;
j++;
}//扩展置换
char B[8][6];
k=0;
j=0;
for(i=0;i<48;i++)
{
if(j==6)
{
j=0;
k++;
}
if(R1[k][j]==K[t][i])
B[k][j]='0';
else
B[k][j]='1';
j++;
}
int Sh[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}}};
for(j=0;j<8;j++)
{
int ai,bi;
ai=(B[j][0]-48)*2+B[j][5]-48;
bi=(B[j][1]-48)*8+(B[j][2]-48)*4+(B[j][3]-48)*2+B[j][4]-48;
l=Sh[j][ai][bi];
k=8;
for(i=0;i<4;i++)
{
int aii;
aii=l/k;
if(aii==1)
B[j][i]='1';
else
B[j][i]='0';
l=l%k;
k=k/2;
}
B[j][i]='\0';
}//S盒替换
int Ph[32]={15,6,19,20,28,11,27,16,
0,14,22,25,4,17,30,9,
1,7,23,13,31,26,2,8,
18,12,29,5,21,10,3,24};
char temp[32],temp1[32];
k=0;
j=0;
for (i=0;i<32;i++)
{
if(j==4)
{
j=0;
k=k+1;
}
temp[i]=B[k][j];
j++;
}
for(i=0;i<32;i++)
{
l=Ph[i];
temp1[i]=temp[l];
}
for(i=0;i<32;i++)
{
if(temp1[i]==L[t][i])
R[t+1][i]='0';
else
R[t+1][i]='1';
L[t+1][i]=R[t][i];
}
//char temp2[64];
for(i=0;i<64;i++)
{
l=ip2[i];
if(i<32)
temp2[i]=R[16][i];
else
temp2[i]=L[16][i-32];
}
}
char temp3[64];
for(i=0;i<64;i++)
{
l=ip2[i];
temp3[i]=temp2[l];
}
temp3[i]='\0';
m_miwen=temp3;
UpdateData(false);
}
void CDES_youngDlg::OnButton2()
{UpdateData(true);
//m_miwen="0111100101010111011000100110101100111010110110101011110100010110";
//m_key="0001001100110100010101110111100110011011101111001101111111110001";
char temp2[64];
char keyT[56],C[17][28],D[17][28],K1[16][56],K[16][48];
int pc1[56] = {56,48,40,32,24,16,8,0,57,49,41,33,25,17,
9,1,58,50,42,34,26,18,10,2,59,51,43,35,
62,54,46,38,30,22,14,6,61,53,45,37,29,21,
13,5,60,52,44,36,28,20,12,4,27,19,11,3};
int pc2[48] = {13,16,10,23,0,4,2,27,14,5,20,9,
22,18,11,3,25,7,15,6,26,19,12,1,
40,51,30,36,46,54,29,39,50,44,32,47,
43,48,38,55,33,52,45,41,49,35,28,31};
int i,l;
for(i=0;i<56;i++)
{
l=pc1[i];
keyT[i]=m_key[l];
if(i<28)
C[0][i]=keyT[i];
else
D[0][i-28]=keyT[i];
}//置换选择pc-1
int move[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
for(i=0;i<16;i++)
{
l=move[i];//循环左移的位数
for(int j=0;j<28;j++)
{
if(j+l<28)
C[i+1][j]=C[i][j+l];
else
C[i+1][j]=C[i][j-27];
K1[i][j]=C[i+1][j];
}
for(j=0;j<28;j++)
{
if(j+l<28)
D[i+1][j]=D[i][j+l];
else
D[i+1][j]=D[i][j-27];
K1[i][j+28]=D[i+1][j];
}
int m=0;
for(j=0;j<48;j++)
{
int dd;
m=pc2[j];
dd=K1[i][m];
K[i][j]=dd;
}
}//密钥变换全部结束
/*对明文进行处理*/
int ip1[64]={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,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6};
int ip2[64]={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,
32,0,40,8,48,16,56,24};
/*尚未考虑输入不足64位的处理方案*/
char data[64],L[17][32],R[17][32];
for(i=0;i<64;i++)
{
l=ip1[i];
data[i]=m_miwen[l];
if(i<32)
L[0][i]=data[i];
else
R[0][i-32]=data[i];
}
int Eh[48]={31,0,1,2,3,4,
3,4,5,6,7,8,
7,8,9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31,0};
//开始迭代
for(int t=0;t<16;t++)
{
char R1[8][6];
int k=0;
int j=0;
for(i=0;i<48;i++)
{
int dc;
l=Eh[i];
if(j==6)
{
j=0;
k++;
};
dc=R[t][l];
R1[k][j]=dc;
j++;
}//扩展置换
char B[8][6];
k=0;
j=0;
for(i=0;i<48;i++)
{
if(j==6)
{
j=0;
k++;
}
if(R1[k][j]==K[15-t][i])
B[k][j]='0';
else
B[k][j]='1';
j++;
}
int Sh[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}}};
for(j=0;j<8;j++)
{
int ai,bi;
ai=(B[j][0]-48)*2+B[j][5]-48;
bi=(B[j][1]-48)*8+(B[j][2]-48)*4+(B[j][3]-48)*2+B[j][4]-48;
l=Sh[j][ai][bi];
k=8;
for(i=0;i<4;i++)
{
int aii;
aii=l/k;
if(aii==1)
B[j][i]='1';
else
B[j][i]='0';
l=l%k;
k=k/2;
}
B[j][i]='\0';
}//S盒替换
int Ph[32]={15,6,19,20,28,11,27,16,
0,14,22,25,4,17,30,9,
1,7,23,13,31,26,2,8,
18,12,29,5,21,10,3,24};
char temp[32],temp1[32];
k=0;
j=0;
for (i=0;i<32;i++)
{
if(j==4)
{
j=0;
k=k+1;
}
temp[i]=B[k][j];
j++;
}
for(i=0;i<32;i++)
{
l=Ph[i];
temp1[i]=temp[l];
}
for(i=0;i<32;i++)
{
if(temp1[i]==L[t][i])
R[t+1][i]='0';
else
R[t+1][i]='1';
L[t+1][i]=R[t][i];
}
//char temp2[64];
for(i=0;i<64;i++)
{
l=ip2[i];
if(i<32)
temp2[i]=R[16][i];
else
temp2[i]=L[16][i-32];
}
}
char temp3[64];
for(i=0;i<64;i++)
{
l=ip2[i];
temp3[i]=temp2[l];
}
temp3[i]='\0';
m_mingwen=temp3;
UpdateData(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -