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

📄 lockdlg.cpp

📁 主要完成功能如下: 支持资源管理器的右键菜单; 支持加密和解密; 加密文件后缀为.lck
💻 CPP
字号:
// LockDlg.cpp : implementation file
//

#include "stdafx.h"
#include "FreeLock.h"
#include "FreeLockDlg.h"
#include "LockDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLockDlg dialog


CLockDlg::CLockDlg(char *cp,CWnd* pParent /*=NULL*/)
	: CDialog(CLockDlg::IDD, pParent)
{FilePath=cp;
	//{{AFX_DATA_INIT(CLockDlg)
	Delete = FALSE;
	FileName = _T("");
	Key1 = _T("");
	Key2 = _T("");
	Compress = FALSE;
	//}}AFX_DATA_INIT
}


void CLockDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CLockDlg)
	DDX_Control(pDX, IDC_LOCK, Lock);
	DDX_Check(pDX, IDC_DELETE, Delete);
	DDX_Text(pDX, IDC_FILE, FileName);
	DDX_Text(pDX, IDC_KEY1, Key1);
	DDV_MaxChars(pDX, Key1, 20);
	DDX_Text(pDX, IDC_KEY2, Key2);
	DDV_MaxChars(pDX, Key2, 20);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CLockDlg, CDialog)
	//{{AFX_MSG_MAP(CLockDlg)
	ON_BN_CLICKED(IDC_ABOUT, OnAbout)
	ON_BN_CLICKED(IDC_LOCK, OnLock)
	ON_EN_CHANGE(IDC_KEY1, OnChangeKey1)
	ON_EN_CHANGE(IDC_KEY2, OnChangeKey2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLockDlg message handlers

void CLockDlg::OnAbout() 
{
 CFreeLockDlg dlg;
	dlg.DoModal();	
}

BOOL CLockDlg::OnInitDialog() 
{
 SetWindowText("文件加密");
	CDialog::OnInitDialog();
 File.SetFilePath(FilePath);
	FileName=File.GetFileName();
 Delete=TRUE;
 UpdateData(FALSE);
	return TRUE;
}

void CLockDlg::OnLock() 
{
 int i=0;
 char NewName[MAX_PATH];
 unsigned char Buffer[BUFFER_SIZE];

 UpdateData(TRUE);
 OnCancel();

 CString Extension=FileName;

 while(FileName[i]&&FileName[i]!='.')
 {
  NewName[i]=FileName[i];
  i++;
 }

 NewName[i]='\0';
 strcat(NewName,".lck");

 Extension.Delete(0,i);
 Extension.MakeLower();

 char TempPath[MAX_PATH];
 GetTempPath(MAX_PATH,TempPath);

 strcat(TempPath,NewName);

 if(Extension==".lck")
 {
  if(AfxMessageBox("文件["+FileName+"]可能已经被加密,是否继续?",MB_YESNO|MB_ICONEXCLAMATION,0)==IDNO)
   return;
 }

 CFile Output(TempPath,CFile::modeCreate|CFile::modeWrite);

 File.Open(FilePath,CFile::modeRead);

 unsigned char Length=FileName.GetLength();
 Output.Write(&Length,sizeof(unsigned char));
 Output.Write(FileName,Length);

 srand((unsigned)time(NULL));

 Length=Key1.GetLength();
 unsigned char Index[20];
 unsigned char *Key=(unsigned char *)LPCTSTR(Key1);
 for(i=0;i<Length;i++)
  Index[i]=i;

 for(i=0;i<Length;i++)
 {
  int m=rand()*Length/RAND_MAX;
  if(m==i)
   continue;
  int j=Index[m];
  char ch=Key[m];
  Index[m]=Index[i];
  Key[m]=Key[i];
  Index[i]=j;
  Key[i]=ch;
 }
 
 unsigned char LengthData=Length^131;
 Output.Write(&LengthData,sizeof(unsigned char));

 unsigned char BlueJoe[10]="白乔 浪浪";
 unsigned char ch,*cp1=(unsigned char *)LPCTSTR(Key2),*cp2=BlueJoe;

 for(i=0;i<Length;i++)
 {
  ch=Key[i]^(*cp2);
  cp2++;
  if(!*cp2)
   cp2=BlueJoe;
  Output.Write(&ch,sizeof(unsigned char));

  ch=Index[i]^131;
  Output.Write(&ch,sizeof(unsigned char));
 }
 
 cp2=BlueJoe;
 while(1)
 {int Size=File.Read(Buffer,BUFFER_SIZE);
  if(!Size)
   break;
  unsigned char *cp=Buffer;
  i=0;
  while(i<Size)
  {*cp=(*cp)^(*cp1)^(*cp2);
   cp++;
   cp1++;
   cp2++;
   i++;
   if(!*cp1)
    cp1=(unsigned char *)LPCTSTR(Key2);
   if(!*cp2)
    cp2=BlueJoe;
  }
  Output.Write(Buffer,Size);
  if(Size<BUFFER_SIZE)
  break;
 }

 Output.Close();
 File.Close();

 if(Delete)
  File.Remove(FileName);

 if(File.Open(NewName,CFile::modeRead))
 {
  File.Close();
  File.Remove(NewName);
 }
 Output.Rename(TempPath,NewName);
}

void CLockDlg::OnChangeKey1() 
{Check();
}

void CLockDlg::OnChangeKey2() 
{Check();
}

void CLockDlg::Check()
{UpdateData(TRUE);
 if(Key1.GetLength()&&(Key1==Key2))
 {Lock.EnableWindow(TRUE);
 }
 else
 {Lock.EnableWindow(FALSE);
 }
}

⌨️ 快捷键说明

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