📄 vc_sdes_child.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 + -