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

📄 viewdlg.cpp

📁 这是一个用VC.Net编写的加密算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -