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

📄 unitmain.cpp

📁 我写的利用IDEA算法的加密程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	    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 + -