?? myfile.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位的密鑰轉(zhuǎn)換為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++)//循環(huán)左移
{
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])//進(jìn)行換位變換
{
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函數(shù)
{
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])//串聯(lián)左右兩部分并進(jìn)行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])//位轉(zhuǎn)換為字符
{
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);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -