📄 unitmain.cpp
字号:
cipher_idea(in, out, ZK);
FileWrite(DesFileHandle, out, i);
}
}
void CipherFile(int SrcFileHandle, int DesFileHandle, IDEAkey Z)
{
int i;
word16 in[4000], out[4000];
while ((i=FileRead(SrcFileHandle, in, 8000)) == 8000) //加密明文
{
CurBlock++;
for (int j=0; j<1000; j++)
cipher_idea(in+4*j, out+4*j, Z);
FileWrite(DesFileHandle, out, 8000);
if (Interrupt == true)
{
FileClose(DesFileHandle);
FileClose(SrcFileHandle);
DeleteFile(FormMain->DesFile);
ShowMessage("加密已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = (float)(CurBlock)*100/AllSize*8000;
}
if (i != 0) //加密最后一个不完整分组
{
for (int j=0; j<i/8; j++)
cipher_idea(in+4*j, out+4*j, Z);
FileWrite(DesFileHandle, out, (i/8)*8);
if (i%8 !=0)
{
char tmp[8] = {0};
memcpy(in+i%8, tmp, 8-i%8);
cipher_idea(in, out, Z);
FileWrite(DesFileHandle, out, 8);
}
}
}
void CipherDirectory(char *SrcFile, char *DesFile, IDEAkey Z)
{
int SrcFileHandle, DesFileHandle;
FileStruct FStruct;
DirectoryInfo DirInfo(SrcFile);
FormMain->Memo1->Lines->Add("正在分析文件结构...");
DirInfo.Search();
strcpy(FStruct.FileTag, "ideadhf"); //生成文件头
FStruct.NodeCount = DirInfo.NodeCount;
AllSize = FStruct.AllSize = DirInfo.SizeOfAll;
try
{
word16 in[4], out[4], i;
if (FileExists(DesFile))
DeleteFile(DesFile);
DesFileHandle = FileCreate(DesFile);
if (DesFileHandle == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(DesFile)+"失败");
return;
}
Application->ProcessMessages();
FormMain->Memo1->Lines->Add(IntToStr(DirInfo.NumOfDirectory)+"个文件夹");
FormMain->Memo1->Lines->Add(IntToStr(DirInfo.NumOfFile)+"个文件");
FormMain->Memo1->Lines->Add("共"+IntToStr(AllSize)+"字节");
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);
CipherNodes(DirInfo, DesFileHandle, Z); //加密目录文件结构
FormMain->Memo1->Lines->Add("正在加密...");
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = 0;
AnsiString Path[20]; //最多20级目录 ,FileName为文件全名(全局变量)
Path[0] = DirInfo.BaseDir;
for (int iter=0; iter<DirInfo.NodeCount; iter++)
{
if (Interrupt == true)
{
ShowMessage("加密已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
FileClose(DesFileHandle);
return;
}
if (DirInfo.Nodes[iter].Flag == 1)
{
if (DirInfo.Nodes[iter].Level != 0)
Path[DirInfo.Nodes[iter].Level] = DirInfo.Nodes[iter].Name;
}
else
{
FileName = Path[0]+"\\";
for (i=1; i<DirInfo.Nodes[iter].Level; i++)
FileName = FileName + Path[i] + "\\";
FileName = FileName + DirInfo.Nodes[iter].Name;
if ((SrcFileHandle = FileOpen(FileName, fmOpenRead)) == -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);
CipherFile(SrcFileHandle, DesFileHandle, Z); //加密文件
if (Interrupt == true)
return;
FileClose(SrcFileHandle);
Application->ProcessMessages();
}
}
}
catch(...)
{
ShowMessage("文件读写错误");
}
FileClose(DesFileHandle);
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 CipherNodes(DirectoryInfo &DirInfo, int DesFileHandle, IDEAkey Z)
{
NODE Node;
word16 *in = (word16 *)(Node.Name);
int InfoSize = DirInfo.NodeCount*128;
word16 *out = new word16[InfoSize/2];
for (int i=0; i<DirInfo.NodeCount; i++)
{
Node = DirInfo.Nodes[i];
for (int j=0; j<16; j++)
cipher_idea(in+4*j, out+64*i+4*j, Z);
if (i % 100 == 0)
{
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = i*100/DirInfo.NodeCount;
}
}
FileWrite(DesFileHandle, out, DirInfo.NodeCount * 128);
delete out;
}
void __fastcall TFormMain::suiButton3Click(TObject *Sender)
{
int CutSize = 0;
TFormCut *FormCut = new TFormCut(this, SrcFile, DesFile, &CutSize, FormMain->style);
if (FormCut->ShowModal()==mrCancel)
return;
delete FormCut;
DesFile[strlen(DesFile)-4] = '\0';
int SrcFileHandle, DesFileHandle;
int FileLength, FileNum;
const int MEGA = 1024*1024;
char *Buffer = new char[MEGA];
SrcFileHandle = FileOpen(SrcFile, fmOpenRead);
if (SrcFileHandle == -1)
{
ShowMessage("打开文件"+static_cast<AnsiString>(SrcFile)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
FileLength = FileSeek(SrcFileHandle, 0, 2);
FileSeek(SrcFileHandle, 0, 0);
FileNum = FileLength/CutSize + (FileLength%CutSize==0 ? 0 : 1);
Memo1->Lines->Add("正在将文件");
Memo1->Lines->Add(SrcFile);
Memo1->Lines->Add("分割成"+IntToStr(FileNum)+"个文件");
Memo1->Lines->Add("请等候...");
FormMain->SpeedButton1->Enabled = true;
CurBlock = 0; //当前加密块,用来统计进度
Interrupt = false;
char FileName[255];
int i=1, ReadNum;
sprintf(FileName, "%s.%03d", DesFile, i);
if (FileExists(FileName))
{
DeleteFile(FileName);
}
DesFileHandle = FileCreate(FileName);
if (DesFileHandle == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(FileName)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
CutStruct CStruct;
strcpy(CStruct.FileTag, "cutduhf");
CStruct.FileNum = FileNum;
CStruct.FileLength = FileLength;
FileWrite(DesFileHandle, &CStruct, 16);
Memo1->Lines->Add("正在生成文件 "+static_cast<AnsiString>(FileName));
for (i=1; i<=FileNum; i++)
{
if (i > 1)
{
sprintf(FileName, "%s.%03d", DesFile, i);
if (FileExists(FileName))
{
DeleteFile(FileName);
}
DesFileHandle = FileCreate(FileName);
if (DesFileHandle == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(FileName)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
Memo1->Lines->Add("正在生成文件 "+static_cast<AnsiString>(FileName));
}
for (int j=0; j<CutSize/MEGA; j++)
{
CurBlock++;
FileWrite(DesFileHandle, Buffer, FileRead(SrcFileHandle, Buffer, MEGA));
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)*MEGA/FileLength*100;
}
if (CutSize%MEGA !=0)
{
FileWrite(DesFileHandle, Buffer, FileRead(SrcFileHandle, Buffer, CutSize%MEGA));
}
FileClose(DesFileHandle);
}
FileClose(SrcFileHandle);
delete[] Buffer;
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 __fastcall TFormMain::suiButton4Click(TObject *Sender)
{
TFormComb *FormComb = new TFormComb(this, SrcFile, DesFile, FormMain->style);
if (FormComb->ShowModal()==mrCancel)
return;
delete FormComb;
SrcFile[strlen(SrcFile)-4] = '\0';
int SrcFileHandle, DesFileHandle;
char FileName[255];
const int MEGA = 1024*1024;
char *Buffer = new char[MEGA];
Memo1->Lines->Add("正在将文件");
Memo1->Lines->Add(static_cast<AnsiString>(SrcFile)+" 系列");
Memo1->Lines->Add("合并成"+IntToStr(DesFile));
Memo1->Lines->Add("请等候...");
CurBlock = 0;
Interrupt = false;
FormMain->SpeedButton1->Enabled = true;
int i=1;
sprintf(FileName, "%s.%03d", SrcFile, i);
CutStruct CStruct;
SrcFileHandle = FileOpen(FileName, fmOpenRead);
if (SrcFileHandle == -1)
{
ShowMessage("打开文件"+static_cast<AnsiString>(FileName)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
FileRead(SrcFileHandle, &CStruct, 16);
if (strcmp(CStruct.FileTag, "cutduhf")!=0)
{
ShowMessage(static_cast<AnsiString>(FileName)+"不是有效的切割文件,不能合并!");
FileClose(SrcFileHandle);
return;
}
if (FileExists(DesFile))
{
DeleteFile(DesFile);
}
DesFileHandle = FileCreate(DesFile);
if (DesFileHandle == -1)
{
ShowMessage("建立文件"+static_cast<AnsiString>(DesFile)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
Memo1->Lines->Add("正在合并文件 "+static_cast<AnsiString>(FileName));
int ReadNum;
for (i=1; i<=CStruct.FileNum; i++ )
{
if (i > 1)
{
sprintf(FileName, "%s.%03d", SrcFile, i);
SrcFileHandle = FileOpen(FileName, fmOpenRead);
if (SrcFileHandle == -1)
{
ShowMessage("打开文件"+static_cast<AnsiString>(FileName)+"失败");
ShowMessage("操作已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
}
Memo1->Lines->Add("正在合并文件 "+static_cast<AnsiString>(FileName));
while ((ReadNum = FileRead(SrcFileHandle, Buffer, MEGA))!=0)
{
if (Interrupt == true)
{
FileClose(DesFileHandle);
FileClose(SrcFileHandle);
DeleteFile(DesFile);
ShowMessage("合并已取消!");
FormMain->Memo1->Clear();
FormMain->Memo1->Lines->Add("请选择操作...");
FormMain->suiProgressBar1->Position = 0;
FormMain->SpeedButton1->Enabled = false;
return;
}
CurBlock++;
FileWrite(DesFileHandle, Buffer, ReadNum);
Application->ProcessMessages();
FormMain->suiProgressBar1->Position = (float)(CurBlock)*MEGA/CStruct.FileLength*100;
}
FileClose(SrcFileHandle);
}
FileClose(DesFileHandle);
delete[] Buffer;
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 __fastcall TFormMain::N14Click(TObject *Sender)
{
if (ShellExecute(NULL, "open", "hh.exe", "EasyCipher.chm", NULL, SW_SHOWNORMAL)<=(HINSTANCE)(32))
{
ShowMessage("打不开帮助文件EashCipher.chm, 错误号:"+IntToStr(GetLastError()));
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -