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

📄 desdlg.cpp

📁 输入任意长明文及8位密钥
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// DESDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DES.h"
#include "DESDlg.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

void Byte_To_Bit(char *,char *);/*将8字节转换为64字节*/
void key_creat(char *);/*密钥生成*/
void pc1_trans(char *,char *);/*PC-1置换*/
void pc2_trans(char *,char *);/*PC-2置换*/
void DES(char *,char *,int);/*加密程序*/
void G_fuction(char *,char *,int);/*G函数*/
void ip_trans(char *,char *);/*IP置换*/
void ip_trans_ni(char *,char *);/*IP逆置换*/
void xor(char *,char *,int);/*按位加*/
void P_dataex(char *,char *);/*P置换*/
void suijixing(char *,int);/*随机性测试*/

int ip[]={
	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
};/*IP置换*/

int ip_ni[]={
    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
};/*IP逆置换*/

int E[]={
	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
};/*E扩展*/

//下面为S盒
int S_box[8][64]={
	{  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}
};

int P[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
};/*P置换*/

int pc1[]={
    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
};/*PC-1置换*/

int pc2[]={
	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
};/*PC-2置换*/

int moveleft[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
char key[16][48];
char suiji[14][2];

/////////////////////////////////////////////////////////////////////////////
// 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_mingwenstring = _T("");
	m_miwenstring = _T("");
	m_miyaostring = _T("");
	m_0 = _T("");
	m_1 = _T("");
	m_00 = _T("");
	m_01 = _T("");
	m_10 = _T("");
	m_11 = _T("");
	m_000 = _T("");
	m_001 = _T("");
	m_010 = _T("");
	m_011 = _T("");
	m_100 = _T("");
	m_101 = _T("");
	m_110 = _T("");
	m_111 = _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_EDIT1, m_mingwenstring);
	DDX_Text(pDX, IDC_EDIT2, m_miwenstring);
	DDX_Text(pDX, IDC_EDIT3, m_miyaostring);
	DDX_Text(pDX, IDC_EDIT4, m_0);
	DDX_Text(pDX, IDC_EDIT5, m_1);
	DDX_Text(pDX, IDC_EDIT6, m_00);
	DDX_Text(pDX, IDC_EDIT7, m_01);
	DDX_Text(pDX, IDC_EDIT8, m_10);
	DDX_Text(pDX, IDC_EDIT9, m_11);
	DDX_Text(pDX, IDC_EDIT10, m_000);
	DDX_Text(pDX, IDC_EDIT11, m_001);
	DDX_Text(pDX, IDC_EDIT12, m_010);
	DDX_Text(pDX, IDC_EDIT13, m_011);
	DDX_Text(pDX, IDC_EDIT14, m_100);
	DDX_Text(pDX, IDC_EDIT15, m_101);
	DDX_Text(pDX, IDC_EDIT16, m_110);
	DDX_Text(pDX, IDC_EDIT17, m_111);
	//}}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_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	//}}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::OnButton1() 
{
	// TODO: Add your control notification handler code here
    char *p,*q,*r;
    int flag1,flag2,i,j,temp,x,y;
	char ming8[8];/*8字节长明文*/
    char mingwen[64];/*明文的01字符串*/
    char miwen[64];/*密文的01字符串*/
	char buf[65];/*由数组转换至CString中转空间*/
	char tempchar[8];/*存储明文的最后八个字节*/
	char duankuai[64];/*需短块处理的明文*/
	CString str;

    UpdateData();
	if(m_mingwenstring.GetLength()==0)
        MessageBox("请输入明文","提示",MB_OK);
	else
	{	
     	if(m_miyaostring.GetLength()==0)
	    	 MessageBox("请输入密钥","提示",MB_OK); 
        else
		{
            if(m_miyaostring.GetLength()!=8)
	            MessageBox("密钥长度错误,请重新输入8位密钥","提示",MB_OK);
			else
			{
                p=m_miyaostring.GetBuffer(0);
                key_creat(p);
				str=m_mingwenstring;
                q=str.GetBuffer(0);
				flag1=str.GetLength();
				for(i=0;i<8;i++)
					tempchar[i]=p[flag1-8+i];/*将明文的最后八个字节存储*/
				temp=flag1%8;/*取需短块处理的字节数*/
				flag1-=temp;/*计数不需短块处理的明文字节数*/
				flag2=0;/*计数不需短块处理的加密次数*/
				m_miwenstring="";
				while(flag1)
				{
	            	for(j=0;j<8;j++)
						ming8[j]=q[j+flag2*8];
			    	flag2++;
					flag1-=8;
				    Byte_To_Bit(ming8,mingwen);
					DES(mingwen,miwen,1);
					for(i=0;i<64;i++)
						buf[i]=miwen[i];
					buf[64]='\0';
					m_miwenstring+=buf;
				}
				//判断是否短块处理
				if(temp!=0)
				{
					MessageBox("需要进行短块处理","提示",MB_OK);
					x=flag2*64+temp*8-64;
					y=64-temp*8;
					m_miwenstring.Delete(x,y);
					for(i=0;i<64-temp*8;i++)
						mingwen[i]=miwen[temp*8+i];
				    Byte_To_Bit(tempchar,duankuai);
                    for(i=64-temp*8;i<64;i++)
						mingwen[i]=duankuai[i];
				    DES(mingwen,miwen,1);/*加密短块*/
					for(i=0;i<64;i++)
						buf[i]=miwen[i];
					buf[64]='\0';
					m_miwenstring+=buf;
				}
				UpdateData(FALSE);
			}
		}
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -