📄 viewdlg.cpp
字号:
// ViewDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "View.h"
#include "ViewDlg.h"
#include ".\viewdlg.h"
#include <io.h>
#include <direct.h>
#include <string.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CViewDlg 对话框
CViewDlg::CViewDlg(CWnd* pParent /*=NULL*/)
: CDialog(CViewDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CViewDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_editInCodeName, m_editName);
DDX_Control(pDX, IDC_EDIT2, m_editCode);
DDX_Control(pDX, IDC_EDIT1, m_editFile);
}
BEGIN_MESSAGE_MAP(CViewDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_BN_CLICKED(IDCANCEL2, OnBnClickedCancel2)
ON_BN_CLICKED(IDInCode, OnBnClickedIncode)
ON_BN_CLICKED(IDUnCode, OnBnClickedUncode)
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnBnClickedButton2)
END_MESSAGE_MAP()
// CViewDlg 消息处理程序
BOOL CViewDlg::OnInitDialog()
{
CDialog::OnInitDialog();
OnInit();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
//逆置换
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CViewDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CViewDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
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;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CViewDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CViewDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
OnOK();
}
void CViewDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
// FileDialog fg = new FileDialog(;
// ShowDialog(1,NULL);
exit(1);
OnCancel();
}
void CViewDlg::OnBnClickedCancel2()
{
// TODO: 在此添加控件通知处理程序代码
}
void CViewDlg::OnBnClickedIncode()
{
// TODO: 在此添加控件通知处理程序代码
CString name,file,code;
flag=0;
m_editName.GetWindowText(name);
m_editFile.GetWindowText(file);
m_editCode.GetWindowText(code);
if(name.GetLength()==0 || file.GetLength()==0)
MessageBox("文件名不能为空!");
if(code.GetLength()==0)
MessageBox("密钥不能为空!");
if(code.GetLength()<16)
MessageBox("密钥的长度不能短于16位");
else
{
Search();
MessageBox("加密完成!");
}
}
void CViewDlg::OnBnClickedUncode()
{
CString name,file,code;
flag=1;
m_editName.GetWindowText(name);
m_editFile.GetWindowText(file);
m_editCode.GetWindowText(code);
if(name.GetLength()==0 || file.GetLength()==0)
MessageBox("文件名不能为空!");
if(code.GetLength()==0)
MessageBox("密钥不能为空!");
else
{
Search();
MessageBox("解密完成!");
}
}
//自己加的函数
void CViewDlg::OnInit()
{
static int P_dup[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};
for(int i=0;i<32;i++)
P[i]=P_dup[i];
static int IP_athwart_dup[64]={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};
//初始置换
static int IP_IP_dup[64] ={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};
for(i=0;i<64;i++)
{
IP_athwart[i]=IP_athwart_dup[i];
IP_IP[i]=IP_IP_dup[i];
}
//置换选择1数组
static int C1_dup[28] = {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};
static int C2_dup[28] = {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};
for(i=0;i<28;i++)
{
C1[i]=C1_dup[i];
C2[i]=C2_dup[i];
}
//置换选择2数组
static int IP2_dup[48]={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};
//子密钥算法中的循环移位数组
static int W_dup[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
for(i=0;i<16;i++)
W[i]=W_dup[i];
//选择运算E
static int E_dup[48]={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};
for(i=0;i<48;i++)
{
IP2[i]=IP2_dup[i];
E[i]=E_dup[i];
}
//8个S盒
static int S_dup[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,13,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(i=0;i<8;i++)
for(int j=0;j<4;j++)
for(int k=0;k<16;k++)
S[i][j][k]=S_dup[i][j][k];
for(i=0;i<64;i++)
{
Z[i]=0;//初始链接数组
Z_1[i]=0;
}
}
//文件的查找
void CViewDlg::Search()
{
// char szFilename[80];
CString string_code;
CString path_ming=NULL;
CString path_code=NULL;
char code_charALL[16];
char code_char1[8]; //加密密钥
char code_char2[8]; //解密密钥
char sie[SIZE];
int count_1=0;
m_editName.GetWindowText(path_ming);
m_editFile.GetWindowText(path_code);
CString path_temp1="temp1.txt";
CString path_temp2="temp2.txt";
CFile fp_ming(path_ming,CFile::modeReadWrite);
CFile fp_temp1(path_temp1,CFile::modeReadWrite|CFile::modeCreate);
CFile fp_temp2(path_temp2,CFile::modeReadWrite|CFile::modeCreate);
CFile fp_code(path_code,CFile::modeWrite|CFile::modeCreate);
m_editCode.GetWindowText(string_code);
strncpy(code_charALL,(LPCTSTR)string_code,16);
for(int i=0;i<8;i++)
{
code_char1[i]=code_charALL[i];
code_char2[i]=code_charALL[i+8];
}
//加密算法
if(flag==0)
{
code_all(fp_ming,fp_temp1,code_char1);
uncode_all(fp_temp1,fp_temp2,code_char2);
code_all(fp_temp2,fp_code,code_char1);
}
//解密算法
if(flag==1)
{
uncode_all(fp_ming,fp_temp1,code_char1);
code_all(fp_temp1,fp_temp2,code_char2);
uncode_all(fp_temp2,fp_code,code_char1);
}
fp_temp1.Close();
fp_temp2.Close();
CFile::Remove(path_temp1);
CFile::Remove(path_temp2);
fp_ming.Close();
fp_code.Close();
}
//转换函数
//将明文转换为二进制的形式读入数组bin[64]中
void CViewDlg::charTint(char Name[8],int bin[64])
{
for(int i=0; i<64; i++)
bin[7+16*(i/8)-i] = (Name[i>>3]>>(i&7)) & 1;
}
//将二进制的数组转换为字符串的形式输出到数组ch[100]中
void CViewDlg::intTchar(int bin[],char ch[])
{
memset(ch, 0, 8);
for(int i=0; i<64; ++i)
ch[i>>3] |= bin[7+16*(i/8)-i]<<(i&7);
}
//将整形整数转换为4位的二进制码
void CViewDlg::convert(int temp[4],int num)
{
int a=0,b=0;
int count = 0;
for(int j=3;j>=0;j--)
{
b=num%2;
a=num/2;
temp[count++]=b;
num = a;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -