📄 desdlg.cpp
字号:
// DESDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DES.h"
#include "DESDlg.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()
/////////////////////////////////////////////////////////////////////////////
// CDESDlg dialog
CDESDlg::CDESDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDESDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDESDlg)
m_Key = _T("");
m_Plaintext = _T("");
m_Ciphertext = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDESDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDESDlg)
DDX_Text(pDX, IDC_KEY, m_Key);
DDX_Text(pDX, IDC_Plaintext, m_Plaintext);
DDX_Text(pDX, IDC_Ciphertext, m_Ciphertext);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDESDlg, CDialog)
//{{AFX_MSG_MAP(CDESDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_Encryption, OnEncryption)
ON_BN_CLICKED(IDC_Decryption, OnDecryption)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDESDlg message handlers
BOOL CDESDlg::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 CDESDlg::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 CDESDlg::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 CDESDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CDESDlg::OnEncryption()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int k,i,g,j,x,y;
int L[17][32],R[17][32],R1[16][8];
int keyT[56],keys[16][56],K[16][48];
int B[8],tmp[32],tmp1[32],out[64],data[64];
char C[64];
int a[64]={0};
int S[8][4][16]={{{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7}, //输入S盒.
{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(k=0;k<8;k++) //将密钥转化为二进制数.并考虑较验位.
{
g = m_Key[k];
j=0;
for(i=8*k+6;i>8*k;i--)
{
a[i] = g%2;
if(a[i]==1)j++;
g /= 2;
}
if(j%2==0)
a[8*k+7]=1;
else
a[8*k+7]=0;
}
keyT[0] = a[56]; //密钥置换选择1
keyT[1] = a[48];
keyT[2] = a[40];
keyT[3] = a[32];
keyT[4] = a[24];
keyT[5] = a[16];
keyT[6] = a[8];
keyT[7] = a[0];
keyT[8] = a[57];
keyT[9] = a[49];
keyT[10] = a[41];
keyT[11] = a[33];
keyT[12] = a[25];
keyT[13] = a[17];
keyT[14] = a[9];
keyT[15] = a[1];
keyT[16] = a[58];
keyT[17] = a[50];
keyT[18] = a[42];
keyT[19] = a[34];
keyT[20] = a[26];
keyT[21] = a[18];
keyT[22] = a[10];
keyT[23] = a[2];
keyT[24] = a[59];
keyT[25] = a[51];
keyT[26] = a[43];
keyT[27] = a[35];
keyT[28] = a[64];
keyT[29] = a[54];
keyT[30] = a[46];
keyT[31] = a[38];
keyT[32] = a[30];
keyT[33] = a[22];
keyT[34] = a[14];
keyT[35] = a[6];
keyT[36] = a[61];
keyT[37] = a[53];
keyT[38] = a[45];
keyT[39] = a[37];
keyT[40] = a[29];
keyT[41] = a[21];
keyT[42] = a[13];
keyT[43] = a[5];
keyT[44] = a[60];
keyT[45] = a[52];
keyT[46] = a[44];
keyT[47] = a[36];
keyT[48] = a[28];
keyT[49] = a[20];
keyT[50] = a[12];
keyT[51] = a[4];
keyT[52] = a[27];
keyT[53] = a[19];
keyT[54] = a[11];
keyT[55] = a[3];
for(i=0;i<28;i++) //密钥循环左移.生成16个字密钥.
{
keys[0][i] = keyT[((i-1)+28)%28];
}
for(i=28;i<55;i++)
{
keys[0][i] = keyT[(i-1)%28+28];
}
for(i=0;i<28;i++)
{
keys[1][i] = keys[0][((i-1)+28)%28];
}
for(i=28;i<55;i++)
{
keys[1][i] = keys[0][(i-1)%28+28];
}
for(k=2;k<8;k++)
{
for(i=0;i<28;i++)
{
keys[k][i]=keys[k-1][((i-2)+28)%28];
}
for(i=28;i<55;i++)
{
keys[k][i]=keys[k-1][(i-2)%28+28];
}
}
for(i=0;i<28;i++)
{
keys[8][i] = keys[7][((i-1)+28)%28];
}
for(i=28;i<55;i++)
{
keys[8][i] = keys[7][(i-1)%28+28];
}
for(k=9;k<15;k++)
{
for(i=0;i<28;i++)
{
keys[k][i]=keys[k-1][((i-2)+28)%28];
}
for(i=28;i<55;i++)
{
keys[k][i]=keys[k-1][(i-2)%28+28];
}
}
for(i=0;i<28;i++)
{
keys[15][i] = keys[14][((i-1)+28)%28];
}
for(i=28;i<55;i++)
{
keys[15][i] = keys[14][(i-1)%28+28];
}
for(k=0;k<16;k++) //对子密钥进行选择置换2
{
K[k][0]=keys[k][13];
K[k][1]=keys[k][16];
K[k][2]=keys[k][10];
K[k][3]=keys[k][23];
K[k][4]=keys[k][0];
K[k][5]=keys[k][4];
K[k][6]=keys[k][2];
K[k][7]=keys[k][27];
K[k][8]=keys[k][14];
K[k][9]=keys[k][5];
K[k][10]=keys[k][20];
K[k][11]=keys[k][9];
K[k][12]=keys[k][22];
K[k][13]=keys[k][18];
K[k][14]=keys[k][11];
K[k][15]=keys[k][3];
K[k][16]=keys[k][25];
K[k][17]=keys[k][7];
K[k][18]=keys[k][15];
K[k][19]=keys[k][6];
K[k][20]=keys[k][26];
K[k][21]=keys[k][19];
K[k][22]=keys[k][12];
K[k][23]=keys[k][1];
K[k][24]=keys[k][40];
K[k][25]=keys[k][51];
K[k][26]=keys[k][30];
K[k][27]=keys[k][36];
K[k][28]=keys[k][46];
K[k][29]=keys[k][54];
K[k][30]=keys[k][29];
K[k][31]=keys[k][39];
K[k][32]=keys[k][50];
K[k][33]=keys[k][44];
K[k][34]=keys[k][32];
K[k][35]=keys[k][47];
K[k][36]=keys[k][43];
K[k][37]=keys[k][48];
K[k][38]=keys[k][38];
K[k][39]=keys[k][55];
K[k][40]=keys[k][33];
K[k][41]=keys[k][52];
K[k][42]=keys[k][45];
K[k][43]=keys[k][41];
K[k][44]=keys[k][49];
K[k][45]=keys[k][35];
K[k][46]=keys[k][28];
K[k][47]=keys[k][31];
}
for(k=0;k<8;k++) //将明文转换为二进制数.并考虑校验位.
{
g = m_Plaintext[k];
j=0;
for(i=8*k+6;i>8*k;i--)
{
a[i] = g%2;
if(a[i]==1)j++;
g /= 2;
}
if(j%2==0)
a[8*k+7]=1;
else
a[8*k+7]=0;
}
L[0][0]=a[57]; //初始置换IP
L[0][1]=a[49];
L[0][2]=a[41];
L[0][3]=a[33];
L[0][4]=a[25];
L[0][5]=a[17];
L[0][6]=a[9];
L[0][7]=a[1];
L[0][8]=a[59];
L[0][9]=a[51];
L[0][10]=a[43];
L[0][11]=a[35];
L[0][12]=a[27];
L[0][13]=a[19];
L[0][14]=a[11];
L[0][15]=a[3];
L[0][16]=a[61];
L[0][17]=a[53];
L[0][18]=a[45];
L[0][19]=a[37];
L[0][20]=a[29];
L[0][21]=a[21];
L[0][22]=a[13];
L[0][23]=a[5];
L[0][24]=a[63];
L[0][25]=a[55];
L[0][26]=a[47];
L[0][27]=a[39];
L[0][28]=a[31];
L[0][29]=a[23];
L[0][30]=a[15];
L[0][31]=a[7];
R[0][0]=a[56];
R[0][1]=a[48];
R[0][2]=a[40];
R[0][3]=a[32];
R[0][4]=a[24];
R[0][5]=a[16];
R[0][6]=a[8];
R[0][7]=a[0];
R[0][8]=a[58];
R[0][9]=a[50];
R[0][10]=a[42];
R[0][11]=a[34];
R[0][12]=a[26];
R[0][13]=a[18];
R[0][14]=a[10];
R[0][15]=a[2];
R[0][16]=a[60];
R[0][17]=a[52];
R[0][18]=a[44];
R[0][19]=a[36];
R[0][20]=a[28];
R[0][21]=a[20];
R[0][22]=a[12];
R[0][23]=a[4];
R[0][24]=a[62];
R[0][25]=a[54];
R[0][26]=a[46];
R[0][27]=a[38];
R[0][28]=a[30];
R[0][29]=a[22];
R[0][30]=a[14];
R[0][31]=a[6];
for(i=0;i<16;i++) //进行16轮迭代
{
R1[i][0]=R[i][31];
R1[i][1]=R[i][0];
R1[i][2]=R[i][1];
R1[i][3]=R[i][2];
R1[i][4]=R[i][3];
R1[i][5]=R[i][4];
R1[i][6]=R[i][3];
R1[i][7]=R[i][4];
R1[i][8]=R[i][5];
R1[i][9]=R[i][6];
R1[i][10]=R[i][7];
R1[i][11]=R[i][8];
R1[i][12]=R[i][7];
R1[i][13]=R[i][8];
R1[i][14]=R[i][9];
R1[i][15]=R[i][10];
R1[i][16]=R[i][11];
R1[i][17]=R[i][12];
R1[i][18]=R[i][11];
R1[i][19]=R[i][12];
R1[i][20]=R[i][13];
R1[i][21]=R[i][14];
R1[i][22]=R[i][15];
R1[i][23]=R[i][16];
R1[i][24]=R[i][15];
R1[i][25]=R[i][16];
R1[i][26]=R[i][17];
R1[i][27]=R[i][18];
R1[i][28]=R[i][19];
R1[i][29]=R[i][20];
R1[i][30]=R[i][19];
R1[i][31]=R[i][20];
R1[i][32]=R[i][21];
R1[i][33]=R[i][22];
R1[i][34]=R[i][23];
R1[i][35]=R[i][24];
R1[i][36]=R[i][23];
R1[i][37]=R[i][24];
R1[i][38]=R[i][25];
R1[i][39]=R[i][26];
R1[i][40]=R[i][27];
R1[i][41]=R[i][28];
R1[i][42]=R[i][27];
R1[i][43]=R[i][28];
R1[i][44]=R[i][29];
R1[i][45]=R[i][30];
R1[i][46]=R[i][31];
R1[i][47]=R[i][0];
for(j=0;j<48;j++)
{
if(R1[i][j]==K[i][j])
R1[i][j]=0;
else
R1[i][j]=1;
}
for(k=0;k<8;k++)
{
x=2*R1[i][6*k]+R1[i][6*k+5];
y=8*R1[i][6*k+1]+4*R1[i][6*k+2]+2*R1[i][6*k+3]+R1[i][6*k+4];
B[k]=S[k][x][y];
}
for(k=0;k<8;k++)
{
g=B[k];
for(j=4*k+4;j>4*j;j--)
{
tmp[j]=g%2;
g/=2;
}
tmp1[0]=tmp[15];
tmp1[1]=tmp[6];
tmp1[2]=tmp[19];
tmp1[3]=tmp[20];
tmp1[4]=tmp[28];
tmp1[5]=tmp[11];
tmp1[6]=tmp[27];
tmp1[7]=tmp[16];
tmp1[8]=tmp[0];
tmp1[9]=tmp[14];
tmp1[10]=tmp[22];
tmp1[11]=tmp[25];
tmp1[12]=tmp[4];
tmp1[13]=tmp[17];
tmp1[14]=tmp[30];
tmp1[15]=tmp[9];
tmp1[16]=tmp[1];
tmp1[17]=tmp[7];
tmp1[18]=tmp[23];
tmp1[19]=tmp[13];
tmp1[20]=tmp[31];
tmp1[21]=tmp[26];
tmp1[22]=tmp[2];
tmp1[23]=tmp[8];
tmp1[24]=tmp[18];
tmp1[25]=tmp[12];
tmp1[26]=tmp[29];
tmp1[27]=tmp[5];
tmp1[28]=tmp[21];
tmp1[29]=tmp[10];
tmp1[30]=tmp[3];
tmp1[31]=tmp[24];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -