📄 unitmain.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vector>
#pragma hdrstop
#include "UnitMain.h"
#include "UnitAbout.h"
#include "UnitCode.h"
#include <stdio.h>
#include <mem.h>
#include <string.h>
#include "UnitDecode.h"
#include "UnitCut.h"
#include "UnitComb.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SUIForm"
#pragma link "SUIButton"
#pragma link "SUIProgressBar"
#pragma link "SUIImagePanel"
#pragma link "SnButton"
#pragma link "SnPanel"
#pragma link "SUIMainMenu"
#pragma link "SUIToolBar"
#pragma link "SUIURLLabel"
#pragma link "SUIMemo"
#pragma link "SUIScrollBar"
#pragma resource "*.dfm"
using namespace std;
TFormMain *FormMain;
bool Interrupt; // 用来中断操作
int AllSize, CurBlock; //加密对象总大小和当前加密块号,用来统计进度
AnsiString FileName; //用来存储当前加密或解密文件的全名称(含路径)
//---------------------------------------------------------------------------
__fastcall TFormMain::TFormMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::suiButton1Click(TObject *Sender)
{
for (int i=0; i<21; i++)
Passwd[i] = '$';
bool FileCode; //加密类型,true为文件加密,否则为文件夹加密
TFormCode *FormCode = new TFormCode(FormMain->style, this, SrcFile, DesFile, Passwd, &FileCode);
TModalResult MR = FormCode->ShowModal();
delete FormCode;
if ( MR== mrCancel)
return;
Memo1->Clear();
if (FileCode)
Memo1->Lines->Add("正在将文件");
else
Memo1->Lines->Add("正在将文件夹");
Memo1->Lines->Add(SrcFile);
Memo1->Lines->Add("加密为");
Memo1->Lines->Add(DesFile);
Memo1->Lines->Add("请等候...");
key_gen(Passwd, UserKey);
en_key_idea(UserKey, Z);//生成子加密密钥
FormMain->SpeedButton1->Enabled = true;
CurBlock = 0; //当前加密块,用来统计进度
Interrupt = false;
if (FileCode)
{
int SrcFileHandle, DesFileHandle;
FileStruct FStruct;
word16 in[4], out[4];
if (FileExists(DesFile))
DeleteFile(FileName);
DesFileHandle = FileCreate(DesFile);
if (DesFileHandle == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(DesFile)+"失败");
return;
}
SrcFileHandle = FileOpen(SrcFile, fmOpenRead);
if (SrcFileHandle == -1)
{
ShowMessage("打开文件"+static_cast<AnsiString>(SrcFile)+"失败");
ShowMessage("加密已中断");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
return;
}
AllSize = FStruct.AllSize = FileSeek(SrcFileHandle, 0, 2);
FileSeek(SrcFileHandle, 0, 0);
FStruct.NodeCount = 1;
strcpy(FStruct.FileTag, "ideadhf");
memcpy(in, FStruct.FileTag, 8); //加密FStruct
cipher_idea(in, out, Z);
FileWrite(DesFileHandle, out, 8);
memcpy(in, &FStruct.AllSize, 8);
cipher_idea(in, out, Z);
FileWrite(DesFileHandle, out, 8);
NODE Node;
strcpy(Node.Name, ExtractFileName(SrcFile).c_str());
Node.Flag = 0;
Node.Level = 0;
Node.FileLength = FStruct.AllSize;
for (int j=0; j<16; j++)
{
cipher_idea((word16 *)(Node.Name+8*j), out, Z);
FileWrite(DesFileHandle, out, 8);
}
CipherFile(SrcFileHandle, DesFileHandle, Z);
if (Interrupt)
return;
FileClose(DesFileHandle);
FileClose(SrcFileHandle);
FormMain->Memo1->Lines->Add("加密完成!");
FormMain->suiProgressBar1->Position = 100;
ShowMessage("加密完成");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
Interrupt = false;
FormMain->SpeedButton1->Enabled = false;
}
else
CipherDirectory(SrcFile, DesFile, Z);
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::N11Click(TObject *Sender)
{
Application->Terminate();
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::N16Click(TObject *Sender)
{
TFormAbout *FormAbout = new TFormAbout(FormMain->style, this);
FormAbout->ShowModal();
delete FormAbout;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::FormCreate(TObject *Sender)
{
style = 0;
for (int i=0; i<21; i++)
Passwd[i] = '$';
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MenuDeepBlueClick(TObject *Sender)
{
if (FormMain->style != 0)
{
FormMain->style = 0;
suiForm1->UIStyle = DeepBlue;
suiForm1->Repaint();
MenuDeepBlue->Checked = true;
MenuWinXp->Checked = false;
MenuMacOS->Checked = false;
MenuBlueGlass->Checked = false;
MenuProtein->Checked = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MenuWinXpClick(TObject *Sender)
{
if (FormMain->style != 1)
{
FormMain->style = 1;
suiForm1->UIStyle = WinXP;
suiForm1->Repaint();
MenuDeepBlue->Checked = false;
MenuWinXp->Checked = true;
MenuMacOS->Checked = false;
MenuBlueGlass->Checked = false;
MenuProtein->Checked = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MenuMacOSClick(TObject *Sender)
{
if (FormMain->style != 2)
{
FormMain->style = 2;
suiForm1->UIStyle = MacOS;
suiForm1->Repaint();
MenuDeepBlue->Checked = false;
MenuWinXp->Checked = false;
MenuMacOS->Checked = true;
MenuBlueGlass->Checked = false;
MenuProtein->Checked = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MenuBlueGlassClick(TObject *Sender)
{
if (FormMain->style != 3)
{
FormMain->style = 3;
suiForm1->UIStyle = BlueGlass;
suiForm1->Repaint();
MenuDeepBlue->Checked = false;
MenuWinXp->Checked = false;
MenuMacOS->Checked = false;
MenuBlueGlass->Checked = true;
MenuProtein->Checked = false;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::MenuProteinClick(TObject *Sender)
{
if (FormMain->style != 4)
{
FormMain->style = 4;
suiForm1->UIStyle = Protein;
suiForm1->Repaint();
MenuDeepBlue->Checked = false;
MenuWinXp->Checked = false;
MenuMacOS->Checked = false;
MenuBlueGlass->Checked = false;
MenuProtein->Checked = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::SpeedButton1Click(TObject *Sender)
{
Interrupt = true;
}
//---------------------------------------------------------------------------
void __fastcall TFormMain::suiButton2Click(TObject *Sender)
{
for (int i=0; i<21; i++)
Passwd[i] = '$';
TFormDecode *FormDecode = new TFormDecode(this, FormMain->style, SrcFile, DesFile, Passwd);
TModalResult MR = FormDecode->ShowModal();
delete FormDecode;
if ( MR== mrCancel)
return;
Memo1->Clear();
Memo1->Lines->Add("正在解密");
Memo1->Lines->Add(SrcFile);
Memo1->Lines->Add("请等候...");
SpeedButton1->Enabled = true; //开始解压
Interrupt = false;
key_gen(Passwd, UserKey); //生成子加密密钥
en_key_idea(UserKey, Z);
de_key_idea(Z, DK);
DeCipher(SrcFile, DesFile, DK);
}
//---------------------------------------------------------------------------
void DeCipher(char *SrcFile, char *DesFile, IDEAkey DK)
{
int SrcFileHandle, DesFileHandle;
word16 in[128], out[128];
FileStruct FStruct;
vector<NODE> Nodes;
if ((SrcFileHandle = FileOpen(SrcFile, fmOpenRead)) == -1)
{
ShowMessage("打开文件"+static_cast<AnsiString>(SrcFile)+"失败");
return;
}
FormMain->Memo1->Lines->Add("正在恢复文件结构...");
FileRead(SrcFileHandle, in, 8); //解密FStruct
cipher_idea(in, out, DK);
memcpy(FStruct.FileTag, out, 8);
FileRead(SrcFileHandle, in, 8);
cipher_idea(in, out, DK);
memcpy(&FStruct.AllSize, out, 8);
if (strcmp(FStruct.FileTag, "ideadhf") != 0)
{
ShowMessage("密码错误或打开文件格式无效!");
FileClose(SrcFileHandle);
return;
}
NODE Node;
for (int i=0; i<FStruct.NodeCount; i++) //解密文件目录结构信息
{
FileRead(SrcFileHandle, in, 128);
for (int j=0; j<16; j++)
{
cipher_idea(in+4*j, out+4*j, DK);
}
CopyMemory(Node.Name, out, 128);
Nodes.push_back(Node);
}
AnsiString Path[20]; //最多20级目录 ,FileName为文件全名(全局变量)
AllSize = FStruct.AllSize; //开始统计进度
CurBlock = 0;
for (int i=0; i<FStruct.NodeCount; i++) //解密目录和文件
{
FileName = DesFile;
for (int j=0; j<Nodes[i].Level; j++)
FileName = FileName + "\\" + Path[j];
FileName = FileName + "\\"+Nodes[i].Name;
if (Nodes[i].Flag == 1) //建立文件夹
{
Path[Nodes[i].Level] = Nodes[i].Name;
ForceDirectories(FileName);
}
else //解密文件
{
if (FileExists(FileName))
{
if (MessageDlg("文件 " + FileName + "已存在,是否覆盖?",
mtConfirmation, TMsgDlgButtons() << mbYes<<mbNo, 0) == mrNo)
{
ShowMessage("解密已取消");
//初始华memo1
return;
}
DeleteFile(FileName);
}
if ((DesFileHandle = FileCreate(FileName)) == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(FileName)+"失败");
FormMain->Memo1->Lines->Add("解密已中断");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
Interrupt = false;
FormMain->SpeedButton1->Enabled = false;
return;
}
FormMain->Memo1->Lines->Add("正在解密" + FileName);
DeCipherFile(SrcFileHandle, DesFileHandle, Nodes[i].FileLength, DK); //解密文件
if (Interrupt == true)
return;
FileClose(DesFileHandle);
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = CurBlock*100*8/FStruct.AllSize;
}
}
FileClose(SrcFileHandle);
FormMain->Memo1->Lines->Add("解密完成!");
FormMain->suiProgressBar1->Position = 100;
ShowMessage("解密完成");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
Interrupt = false;
FormMain->SpeedButton1->Enabled = false;
}
void DeCipherFile(int SrcFileHandle, int DesFileHandle, int FileLength, IDEAkey ZK) //解密文件
{
int i;
word16 in[4000], out[4000];
for (i=0; i<FileLength/8000; i++) //加密明文
{
CurBlock++;
FileRead(SrcFileHandle, in, 8000);
for (int j=0; j<1000; j++)
cipher_idea(in+4*j, out+4*j, ZK);
FileWrite(DesFileHandle, out, 8000);
if (Interrupt == true)
{
FileClose(DesFileHandle);
FileClose(SrcFileHandle);
DeleteFile(FileName);
ShowMessage("解密已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = (float)(CurBlock)*8000/AllSize*100;
}
i = FileLength%8000; //对8000字节整数倍的文件解密有误差
for (int j=0; j<i/8; j++)
{
FileRead(SrcFileHandle, in, 8);
CurBlock++;
cipher_idea(in, out, ZK);
FileWrite(DesFileHandle, out, 8);
}
i = i%8;
if (i != 0) //解密最后一个不完整分组
{
FileRead(SrcFileHandle, in, 8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -