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

📄 vc_sdes_child.cpp

📁 通过编程实现S-DES算法的加密与解密过程
💻 CPP
字号:
// VC_SDES_child.cpp : implementation file
//

#include "stdafx.h"
#include "VC_SDES.h"
#include "VC_SDESDlg.h"
#include "VC_SDES_child.h"
#include <math.h>
#include <fstream>
#include <string>
#include "mmsystem.h" 
#pragma comment(lib,"Winmm.lib") 
using namespace std;

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

/////////////////////////////////////////////////////////////////////////////
// VC_SDES_child dialog

extern int work;
VC_SDES_child::VC_SDES_child(CWnd* pParent /*=NULL*/)
	: CDialog(VC_SDES_child::IDD, pParent)
{
	//{{AFX_DATA_INIT(VC_SDES_child)
	m_key = _T("");
	m_K1 = _T("");
	m_K2 = _T("");
	m_P10 = _T("");
	m_LS1 = _T("");
	m_LS2 = _T("");
	m_P8_1 = _T("");
	m_P8_2 = _T("");
	m_input = _T("");
	m_output = _T("");
	m_outext = _T("");
	m_input1 = _T("");
	m_intext = _T("");
	m_IP = _T("");
	m_FK1 = _T("");
	m_SW = _T("");
	m_FK2 = _T("");
	m_IP_1 = _T("");
	m_key1 = _T("");
	m_oper = -1;
	//}}AFX_DATA_INIT
}


void VC_SDES_child::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(VC_SDES_child)
	DDX_Control(pDX, IDC_music1, m_music1);
	DDX_Text(pDX, IDC_KEY_EDIT, m_key);
	DDV_MaxChars(pDX, m_key, 10);
	DDX_Text(pDX, IDC_K1, m_K1);
	DDX_Text(pDX, IDC_K2, m_K2);
	DDX_Text(pDX, IDC_P10, m_P10);
	DDX_Text(pDX, IDC_LS_1, m_LS1);
	DDX_Text(pDX, IDC_LS_2, m_LS2);
	DDX_Text(pDX, IDC_P8_1, m_P8_1);
	DDX_Text(pDX, IDC_P8_2, m_P8_2);
	DDX_Text(pDX, IDC_INPUT_EDIT, m_input);
	DDV_MaxChars(pDX, m_input, 8);
	DDX_Text(pDX, IDC_OUTPUT_EDIT, m_output);
	DDX_Text(pDX, IDC_OUTEXT_EDIT, m_outext);
	DDX_Text(pDX, IDC_INPUT_EDIT1, m_input1);
	DDX_Text(pDX, IDC_INTEXT_EDIT, m_intext);
	DDX_Text(pDX, IDC_IP, m_IP);
	DDX_Text(pDX, IDC_FK1, m_FK1);
	DDX_Text(pDX, IDC_SW, m_SW);
	DDX_Text(pDX, IDC_FK2, m_FK2);
	DDX_Text(pDX, IDC_IP_1, m_IP_1);
	DDX_Text(pDX, IDC_KEY_EDIT1, m_key1);
	DDX_Radio(pDX, IDC_ENCRYPT_RADIO, m_oper);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(VC_SDES_child, CDialog)
	//{{AFX_MSG_MAP(VC_SDES_child)
	ON_BN_CLICKED(IDC_KEY_BROWSE, OnKeyBrowse)
	ON_BN_CLICKED(IDC_INPUT_BROWSE, OnInputBrowse)
	ON_BN_CLICKED(IDC_START_BUTTON, OnStartButton)
	ON_BN_CLICKED(IDC_FLASH_BUTTON, OnFlashButton)
	ON_BN_CLICKED(IDC_back, Onback)
	ON_BN_CLICKED(IDC_music1, Onmusic1)
	ON_BN_CLICKED(IDC_save, Onsave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// VC_SDES_child message handlers

BOOL VC_SDES_child::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_hIcon1, TRUE);			// Set big icon
	SetIcon(m_hIcon1, FALSE);		// Set small icon
	if (work)
		m_music1.SetCheck(TRUE);
	// TODO: Add extra initialization here
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void VC_SDES_child::OnKeyBrowse() //读取密钥
{
	// TODO: Add your control notification handler code here
	UpdateData();
	CFileDialog m_MyOpenDialog(TRUE,"dat",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All Files (*.*)|*.*||",NULL);
	if(m_MyOpenDialog.DoModal()==IDOK)
	{
		char name[200];
		char data[11];
		CString pathname=m_MyOpenDialog.GetPathName();
		for(int i=0;i<pathname.GetLength();i++)
			name[i]=pathname[i];
		name[i]='\0';
		ifstream file(name,ios::binary);
		file.read((char*)&data,sizeof(data));
		data[10]='\0';
		CString temp(data);
		m_key=temp;
		UpdateData(FALSE);
	}	
}

void VC_SDES_child::OnInputBrowse() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	CFileDialog dlg(TRUE,"dat",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All Files (*.*)|*.*||",NULL);
	if(dlg.DoModal()==IDOK)
	{
		char name[200];
		char data[9];
		CString pathname=dlg.GetPathName();
		for(int i=0;i<pathname.GetLength();i++)
			name[i]=pathname[i];
		name[i]='\0';
		ifstream file(name,ios::binary);
		file.read((char*)&data,sizeof(data));
		data[8]='\0';
		CString temp(data);
		m_input=temp;
		UpdateData(FALSE);
	}
}

void VC_SDES_child::OnStartButton() 
{
	// TODO: Add your control notification handler code here
	UpdateData();
	int state=GetCheckedRadioButton(IDC_ENCRYPT_RADIO,IDC_DECRYPT_RADIO);
	int flag=1;
	if (m_key==""&&m_input=="")
		MessageBox("您还没有输入密钥和明文","ERROR");
	else
		if (m_input=="")
		   	MessageBox("您还没有输入明文","ERROR");
		else
			if (m_key=="")
			    MessageBox("您还没有输入密钥","ERROR");
		else
		{
	for(int i=0;i<m_key.GetLength();i++)//判断输入的正确性
	{
		if(m_key[i]!='0'&&m_key[i]!='1')
		{
			flag=0;
			break;
		}
	}//判断输入的正确性
	for(i=0;i<m_input.GetLength();i++)
	{
		if(m_input[i]!='0'&&m_input[i]!='1')
		{
			flag=0;
			break;
		}
	}
	if(flag==0||m_key.GetLength()<10||m_input.GetLength()<8)
		MessageBox("输入只能为\"0\"和\"1\",且密钥为10位,输入(明文或密文)为8位!","ERROR");
	else
		if (state!=IDC_ENCRYPT_RADIO&&state!=IDC_DECRYPT_RADIO)
			MessageBox("请选择加密或者解密!","ERROR");
	else
	{
		int key[10];//密钥
		int text[8];//输入
		int k1[8],k2[8];//k1,k2
		int in0=0,in1=0,out0=0,out1=0;
		for(i=0;i<10;i++)
			key[i]=(m_key[i]-48);//密钥
		for(i=0;i<8;i++)
			text[i]=(m_input[i]-48);//输入字符转化成数字1或0

		for(i=0;i<4;i++)//获取输出所表示的字母
		{
			in0+=(text[i]*pow(2,3-i));
			in1+=(text[i+4]*pow(2,3-i));
		}
		GetKey(key,k1,k2);
		if(state==IDC_ENCRYPT_RADIO)
		{
			//加密操作
			Operate(text,k1,k2);
		}
		if(state==IDC_DECRYPT_RADIO)
		{
			//解密操作
			Operate(text,k2,k1);
		}
		char temp[10];
		for(i=0;i<8;i++)
			temp[i]=(text[i]+48);

		for(i=0;i<4;i++)//获取输出所表示的字母
		{
			out0+=(text[i]*pow(2,3-i));
			out1+=(text[i+4]*pow(2,3-i));
		}
		char in[3],out[3];
		in[0]=(in0+97);in[1]=(in1+97);in[2]='\0';
		out[0]=(out0+97);out[1]=(out1+97);out[2]='\0';
		CString i(in);
		m_intext=in;
		CString o(out);
		m_outext=o;

		temp[8]='\0';
		CString a(temp);
		m_output=a;

		m_input1=m_input;
		m_IP_1=m_output;
	}
		}
	UpdateData(FALSE);
	
}

void VC_SDES_child::GetKey(int key[], int k1[], int k2[])
{
	UpdateData();
	char temp[12];
	m_key1=m_key;
	int k[10],kl[5],kr[5];
	//P10置换
	k[0]=key[2];k[1]=key[4];k[2]=key[1];k[3]=key[6];k[4]=key[3];
	k[5]=key[9];k[6]=key[0];k[7]=key[8];k[8]=key[7];k[9]=key[5];
	for(int j=0;j<10;j++)
		temp[j]=k[j]+48;//
	temp[j]='\0';
	CString t(temp);
	m_P10=t;
	

	//置换
	for(int i=0;i<4;i++)
		kl[i]=k[i+1];
	kl[4]=k[0];
	for(i=5;i<9;i++)
		kr[i-5]=k[i+1];
	kr[4]=k[5];//分成左五位和右五位,已经左移了一位了。
	char temp0[8],temp1[8];


	for(i=0;i<5;i++)
	{
		temp0[i]=kl[i]+48;
		temp1[i]=kr[i]+48;
	}
	temp0[i]='\0';
	temp1[i]='\0';
	CString t0(temp0);
	CString t1(temp1);
	m_LS1=t0+t1;//赋给控件

	//K1的值
	k1[0]=kr[0];k1[1]=kl[2];k1[2]=kr[1];k1[3]=kl[3];
	k1[4]=kr[2];k1[5]=kl[4];k1[6]=kr[4];k1[7]=kr[3];
	for(i=0;i<8;i++)
	{
		temp[i]=k1[i]+48;
	
	}
	temp[8]='\0';
	CString t2(temp);
	m_P8_1=t2;//赋给控件
	m_K1=t2;//赋给控件
	//求K2
	//置换 直接从k的前后五位左移三位得到
	kl[0]=k[3];kl[1]=k[4];kl[2]=k[0];kl[3]=k[1];kl[4]=k[2];
	kr[0]=k[8];kr[1]=k[9];kr[2]=k[5];kr[3]=k[6];kr[4]=k[7];
	for(i=0;i<5;i++)
	{
		temp0[i]=kl[i]+48;
		temp1[i]=kr[i]+48;
	}
	temp0[i]='\0';
	temp1[i]='\0';
	CString t3(temp0);
	CString t4(temp1);
	m_LS2=t3+t4;

	k2[0]=kr[0];k2[1]=kl[2];k2[2]=kr[1];k2[3]=kl[3];
	k2[4]=kr[2];k2[5]=kl[4];k2[6]=kr[4];k2[7]=kr[3];

	for(i=0;i<8;i++)
	{
		temp[i]=k2[i]+48;
	
	}
	temp[8]='\0';
	CString t5(temp);
	m_P8_2=t5;//赋给控件
	m_K2=t5;//赋给控件

}

void VC_SDES_child::Operate(int text[], int k1[], int k2[])
{
	IP(text);
	int L[4],R[4];
	for(int i=0;i<4;i++)
	{
		L[i]=text[i];
		R[i]=text[i+4];//分成前四位和后四位
	}
	FK(L,R,k1);
	//将中间结果赋给控件
	char temp[10];
	for(i=0;i<4;i++)
	{
		temp[i]=L[i]+48;
		temp[i+4]=R[i]+48;
	}
	temp[8]='\0';
	CString t0(temp);
	m_FK1=t0;//控件

	//SW置换
	for(i=0;i<4;i++)
	{
		temp[i]=R[i]+48;
		temp[i+4]=L[i]+48;
	}
	temp[8]='\0';
	CString t1(temp);
	m_SW=t1;


	
	FK(R,L,k2);

	for(i=0;i<4;i++)
	{
		temp[i]=R[i]+48;
		temp[i+4]=L[i]+48;
	}
	temp[8]='\0';
	CString t2(temp);
	m_FK2=t2;//控件

	for(i=0;i<4;i++)
	{
		text[i]=R[i];
		text[i+4]=L[i];
	}
	IP_1(text);

}

void VC_SDES_child::IP(int text[])
{
	int t[8];
	for(int i=0;i<8;i++)
		t[i]=text[i];
	text[0]=t[1];text[1]=t[5];text[2]=t[2];text[3]=t[0];
	text[4]=t[3];text[5]=t[7];text[6]=t[4];text[7]=t[6];

	//赋给控件
	char p[10];
	for(i=0;i<8;i++)
		p[i]=text[i]+48;
	p[i]='\0';
	CString tt(p);
	m_IP=tt;
	


}

void VC_SDES_child::IP_1(int text[])
{
	int t[8];
	for(int i=0;i<8;i++)
		t[i]=text[i];
	text[0]=t[3];text[1]=t[0];text[2]=t[2];text[3]=t[4];
	text[4]=t[6];text[5]=t[1];text[6]=t[7];text[7]=t[5];

}

void VC_SDES_child::FK(int L[], int R[], int k[])
{
	int CR[4];//返回F函数后出来的值
	F(R,k,CR);
	for(int i=0;i<4;i++)
		L[i]=L[i]^CR[i];


}

void VC_SDES_child::F(int R[], int SK[], int CR[])
{
	int t[8];
	t[0]=R[3];t[1]=R[0];t[2]=R[1];t[3]=R[2];
	t[4]=R[1];t[5]=R[2];t[6]=R[3];t[7]=R[0];
	for(int i=0;i<8;i++)
		t[i]=t[i]^SK[i];
	int S0[4][4]={1,0,3,2,3,2,1,0,0,2,1,3,3,1,3,2};
	int S1[4][4]={0,1,2,3,2,0,1,3,3,0,1,0,2,1,0,3};
	int temp[4];
	temp[0]=S0[t[0]*2+t[3]*1][t[1]*2+t[2]*1]/2;
	temp[1]=S0[t[0]*2+t[3]*1][t[1]*2+t[2]*1]%2;
	temp[2]=S1[t[4]*2+t[7]*1][t[5]*2+t[6]*1]/2;
	temp[3]=S1[t[4]*2+t[7]*1][t[5]*2+t[6]*1]%2;
	CR[0]=temp[1];//P4置换
	CR[1]=temp[3];
	CR[2]=temp[2];
	CR[3]=temp[0];

}

void VC_SDES_child::OnFlashButton() 
{
	// TODO: Add your control notification handler code here
	m_key="";
	m_input="";
	m_output="";
	m_intext="";
	m_outext="";
	m_FK1="";
	m_FK2="";
	m_input1="";
	m_IP="";
	m_IP_1="";
	m_K1="";
	m_K2="";
	m_key1="";
	m_LS1="";
	m_LS2="";
	m_P10="";
	m_P8_1="";
	m_P8_2="";
	m_SW="";
	UpdateData(FALSE);	
}

extern int choose;
void VC_SDES_child::Onback() 
{
	// TODO: Add your control notification handler code here
	OnOK();
    CVC_SDESDlg  dlg;     
    dlg.DoModal();

}

void VC_SDES_child::Onmusic1() 
{
	// TODO: Add your control notification handler code here
	if(m_music1.GetCheck())
	{
		PlaySound((LPCTSTR)IDR_WAVE1, AfxGetInstanceHandle(), SND_ASYNC|SND_RESOURCE|SND_LOOP );	
		work=1;
	}
	else
	{
		PlaySound(NULL,NULL,SND_ASYNC);
		work=0;
	}
}

void VC_SDES_child::Onsave() 
{
	// TODO: Add your control notification handler code here
	if (m_output=="")
		MessageBox("没有可保存密文文件!","ERROR");
	else
	{
    	UpdateData();
    	CFileDialog m_MyOpenDialog(FALSE,"dat",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All Files (*.*)|*.*||",NULL);
   	if(m_MyOpenDialog.DoModal()==IDOK)
	{
		char name[200];
		char data[9];
		string dat=(LPCTSTR)m_output;
		CString pathname=m_MyOpenDialog.GetPathName();
		for(int i=0;i<pathname.GetLength();i++)
			name[i]=pathname[i];
		name[i]='\0';
		for (i=0;i<dat.length();i++)
			data[i]=dat[i];
		data[i]='\0';
		ofstream file(name,ios::binary);
		file.write((char*)&data,sizeof(data));
	}
	}
}

⌨️ 快捷键说明

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