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

📄 des_youngdlg.cpp

📁 一个简单的des加密程序
💻 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 + -