⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 desdlg.cpp

📁 DES加密程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -