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

📄 unitmain.cpp

📁 我写的利用IDEA算法的加密程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#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 + -