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

📄 myfile.cpp

📁 密码学实验中的DES算法
💻 CPP
字号:
// MyFile.cpp : implementation file
//

#include "stdafx.h"
#include "DES.h"
#include "DESDlg.h"
#include "MyFile.h"
#include "math.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMyFile property page

IMPLEMENT_DYNCREATE(CMyFile, CPropertyPage)

CMyFile::CMyFile() : CPropertyPage(CMyFile::IDD)
{
	//{{AFX_DATA_INIT(CMyFile)
	m_FilePath = _T("");
	m_mingwen = _T("*****");
	m_miwen = _T("*****");
	m_filekey = _T("");
	//}}AFX_DATA_INIT
}

CMyFile::~CMyFile()
{
}

void CMyFile::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyFile)
	DDX_Text(pDX, IDC_EDIT1, m_FilePath);
	DDX_Text(pDX, IDC_EDIT2, m_mingwen);
	DDX_Text(pDX, IDC_EDIT3, m_miwen);
	DDX_Text(pDX, IDC_EDIT4, m_filekey);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyFile, CPropertyPage)
	//{{AFX_MSG_MAP(CMyFile)
	ON_BN_CLICKED(IDC_FILE_JIAME, OnFileJiame)
	ON_BN_CLICKED(IDC_FILE_JIEMI, OnFileJiemi)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyFile message handlers
void CMyFile::charToBit(CString in,int flag)//获得密钥/明文/密文的64位
{
	int i,j;
	char a;
	int key_64[64],DATA[64];
	if(!flag)
	{
		for(i=0;i<8;i++)
		{
			a=in[i];
			for(j=0;j<8;j++)
			{
				key_64[8*i+7-j]=a&0x01;
				a=(char)((int)a>>1);
			}
		}
		key_64Tokey_56AndkeyT1(key_64);
	}
	if(flag)
	{
		for(i=0;i<8;i++)
		{
			a=in[i];
			for(j=0;j<8;j++)
			{
				DATA[8*i+7-j]=a&0x01;
				a=(char)((int)a>>1);
			}
		}
		IpT(DATA);
	}
}
void CMyFile::key_64Tokey_56AndkeyT1(int key_64[64])//将64位的密钥转换为56位
{
	int i;
	int key_56[56];
	for(i=0;i<56;i++)
		key_56[i]=key_64[keyT1[i]];
	CircleLeftAndkeyT2(key_56);
}
void CMyFile::CircleLeftAndkeyT2(int key_56[56])//获得十六个密钥
{
	int i,j,k;
	int temp_C,temp_D,C[28],D[28],CD[56],key[16][48];
	for(i=0;i<28;i++)
		C[i]=key_56[i];
	for(i=28;i<56;i++)
		D[i-28]=key_56[i];
	for(i=0;i<16;i++)
	{
		for(j=0;j<CircleLeft[i];j++)//循环左移
		{
			temp_C=C[0];
			temp_D=D[0];
			for(k=1;k<28;k++)
			{
				C[k-1]=C[k];
				D[k-1]=D[k];
			}
			C[27]=temp_C;
			D[27]=temp_D;
		}
		for(j=0;j<28;j++)
		{
			CD[j]=C[j];
			CD[j+28]=D[j];
		}
		for(j=0;j<48;j++)
			key[i][j]=CD[keyT2[j]];
	}
	if(FLAG==0)
	{
		for(i=0;i<16;i++)
		{
			for(j=0;j<48;j++)
				RoundKey[i][j]=key[15-i][j];
		}
	}
	else
	{
		for(i=0;i<16;i++)
		{
			for(j=0;j<48;j++)
				RoundKey[i][j]=key[i][j];
		}
	}
}
void CMyFile::Cut(CString str)//将明文分组
{
	CString char_8;
	int i,len,x;
	char ch;
	len=str.GetLength();
	char_8="........";
	for(i=0;i<len;i++)
	{
		if((i+1)%8==0)
		{
			x=i%8;
			ch=str.GetAt(i);
			char_8.SetAt(x,ch);
			charToBit(char_8,1);
			STR+=Result;
		}
		else
		{
			x=i%8;
			ch=str.GetAt(i);
			char_8.SetAt(x,ch);
		}
	}
	if(len%8!=0)
	{
		for(i=len;i<len-len%8+8;i++)
			char_8.SetAt(i%8,'!');
		cnt_a=8-len%8;
		charToBit(char_8,1);
		STR+=Result;
	}	
}
void CMyFile::IpT(int DATA[64])//进行换位变换
{
	int i;
	int data[64];
	for(i=0;i<64;i++)
		data[i]=DATA[IP[i]];
	F(data);
}
void CMyFile::F(int data[64])//F函数
{
	int i,j,k,l;
	int R_48[48],R1[48],L[17][32],R[17][32],B[8][6];
	for(i=0;i<32;i++)
		L[0][i]=data[i];
	for(i=32;i<64;i++)
		R[0][i-32]=data[i];
	for(k=0;k<16;k++)
	{
		for(i=0;i<48;i++)
			R1[i]=R[k][E[i]];
		for(j=0;j<48;j++)
			R_48[j]=R1[j]^RoundKey[k][j];
		j=0;
		for(i=0;i<48;i++)
		{
			if((i%6==0)&&(i!=0))
				j++;
			B[j][i%6]=R_48[i];
		}
		S_funcAndP(B);
		for(l=0;l<32;l++)
			R[k+1][l]=L[k][l]^tmp1[l];
		for(l=0;l<32;l++)
			L[k+1][l]=R[k][l];
	}
	RLAndIP_1(R[16],L[16]);
}

void CMyFile::RLAndIP_1(int R[32],int L[32])//串联左右两部分并进行IP逆置换
{
	int i;
	int tmp2[64],out[64];
	for(i=0;i<32;i++)
	{
		tmp2[i]=R[i];
		tmp2[i+32]=L[i];
	}
	for(i=0;i<64;i++)
		out[i]=tmp2[IP_1[i]];
	BitToChar(out);
}
void CMyFile::BitToChar(int out[64])//位转换为字符
{
	int i,j,k,x;
	char ch;
	if(FLAG==1)
	{
		Result="................";
		j=0;
		for(i=0;i<64;i+=4)
		{
			x=out[i]*8+out[i+1]*4+out[i+2]*2+out[i+3];
			ch=Hex.GetAt(x);
			Result.SetAt(j,ch);
			j++;
		}
	}
	else
	{
		j=0;
		Result="........";
		for(i=0;i<8;i++)
		{
			x=0;
			k=7;
			for(k=7;k>=0;k--)
			{
				x+=(int)(out[j]*pow(2,k));
				j++;
			}
			Result.SetAt(i,x);
		}
	}
}
void CMyFile::CutMiwen(CString str)
{
	int i,j,k,x,DATA[64],len;
	len=str.GetLength();
	k=0;
	for(i=0;i<len;i++)
	{
		if(str[i]>='0'&&str[i]<='9')
			x=str[i]-48;
		else
			x=str[i]-87;
		if((i+1)%16==0)
		{
			for(j=0;j<4;j++)
			{
				DATA[k]=B_H[x][j];
				k++;
			}
			IpT(DATA);
			k=0;
			STR+=Result;
		}
		else
		{
			for(j=0;j<4;j++)
			{
				DATA[k]=B_H[x][j];
				k++;
			}
		}
	}
}
void CMyFile::S_funcAndP(int B[8][6])//S盒变换
{
	int i,j,k,t,x,y;
	int tmp[32];printf("SBox\n");
	for(i=0;i<8;i++)
	{
		j=0;
		x=B[i][0]*2+B[i][5];
		y=B[i][1]*8+B[i][2]*4+B[i][3]*2+B[i][4];
		t=SBox[i][x][y];
		for(j=0;j<4;j++)
		{
			k=i*4+j;
			tmp[k]=B_H[t][j];
		}
	}
	for(i=0;i<32;i++)
		tmp1[i]=tmp[P[i]];
}

void CMyFile::OnFileJiame() 
{
	CFile FileW;
	CFile FileR(m_FilePath,CFile::modeRead|CFile::shareDenyWrite);
	HLOCAL hMem;
	char* pChar;

	hMem=LocalAlloc(LHND,FileR.GetLength()+1);
	if(hMem==NULL)
		return;
	pChar=(char *)LocalLock(hMem);
	FileR.ReadHuge(pChar,FileR.GetLength());
	FileW.Open("miwen.txt",CFile::modeCreate|CFile::modeWrite);
	m_mingwen=pChar;
	if(m_mingwen=="")
	{
		MessageBox("明文为空!","提示");
		return;
	}
	STR="";
	FLAG=1;
	cnt_a=0;
	UpdateData(true);
	if(m_filekey.GetLength()<8)
	{
		MessageBox("密钥字符少于八个!","提示");
		return;
	}
	else
	{
		charToBit(m_filekey,0);
		Cut(m_mingwen);
	}
	FileW.WriteHuge(STR,STR.GetLength());
	LocalUnlock(hMem);
	LocalFree(hMem);
	FileR.Close();
	FileW.Close();
	m_miwen=STR;
	UpdateData(FALSE);	
}

void CMyFile::OnFileJiemi() 
{
CFile FileW;
	CFile FileR(m_FilePath,CFile::modeRead|CFile::shareDenyWrite);
	HLOCAL hMem;
	char* pChar;
	hMem=LocalAlloc(LHND,FileR.GetLength()+1);
	if(hMem==NULL)
		return;
	pChar=(char *)LocalLock(hMem);
	FileR.ReadHuge(pChar,FileR.GetLength());
	FileW.Open("mingwen.txt",CFile::modeCreate|CFile::modeWrite);
	m_miwen=pChar;
	if(m_miwen=="")
	{
		MessageBox("密文为空!","提示");
		return;
	}
	STR="";
	FLAG=0;
	if(m_filekey.GetLength()<8)
	{
		MessageBox("密钥字符少于八个!","提示");
		return;
	}
	else
	{
		charToBit(m_filekey,0);
		CutMiwen(m_miwen);
	}
	if(cnt_a!=0)
		m_mingwen=STR.GetBufferSetLength(STR.GetLength()-cnt_a);
	else
		m_mingwen=STR;
	FileW.WriteHuge(STR,STR.GetLength());
	LocalUnlock(hMem);
	LocalFree(hMem);
	FileR.Close();
	FileW.Close();
	m_mingwen=STR;
	UpdateData(FALSE);	
}

void CMyFile::OnButton4() 
{
	CDialog::OnCancel();	
}

void CMyFile::OnBrowse() 
{
	CFileDialog dlg(TRUE,NULL,NULL,OFN_EXPLORER|OFN_HIDEREADONLY|OFN_ENABLESIZING|OFN_FILEMUSTEXIST,"文本文件(*.txt)|*.txt||");
	CFile file;
	HLOCAL hMem;
	char* pChar;
	if(dlg.DoModal()==IDOK)
		m_FilePath=dlg.GetPathName();
	else
		return;
	file.Open(m_FilePath,CFile::modeRead);
	hMem=LocalAlloc(LHND,file.GetLength()+1);
	if(hMem==NULL)
		return;
	pChar=(char *)LocalLock(hMem);
	file.ReadHuge(pChar,file.GetLength());
	LocalUnlock(hMem);
	LocalFree(hMem);
	file.Close();
	UpdateData(false);	
}

⌨️ 快捷键说明

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