栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

文件加密打包和解密解包

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

文件加密打包和解密解包

文件打包加密和解包解密

提示:这里记录上一章提到的加密解密进行一个进阶的
打包+加密 —— + ——解包+解密


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

加密解密+打包解包
  • 文件打包加密和解包解密
  • 思路
  • 一、怎么加密?
  • 二、使用步骤
    • 1.加密打包
    • 2.解密解包
  • 笔记总结


思路

提示:这里分享一下思路记录的大概内容:
打包加密

  1. //创建打包文件
  2. //循环读取待打包文件
  3. //打包_将读取的数据存储到打包文件里
  4. //保存关闭
  5. //将打包好的文件进行加密
  6. //关闭保存

解包解密:

  1. //读取加密文件
  2. //将读取到的内容进行解密并写入各自对应的文件
  3. //进行解包
  4. //保存关闭

提示:以下是本篇文章正文内容,下面案例可供参考

一、怎么加密?

用运算符,上一章讲到,或者用其他自定义算法都可以。

二、使用步骤 1.加密打包

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include  
#include
#include
#include
#include
#include
//创建结构体存储打包关键信息
struct MyDbJm
{
    char FileName[256];
    int FileSize;
};
int mlqz(double a);
void quit(int n);

int main(int argc, char* argv[])
{
    int key;
    printf("请输入加密密钥:");
    scanf("%d", &key);
    int Num = argc - 1;
    srand((unsigned int)time(NULL));
    //建立结构体数组
    struct MyDbJm* FileIofos = (struct MyDbJm*)malloc(Num * sizeof(struct MyDbJm));
    FILE* XxCc;
    
    printf("本次打包数量%d个n", argc - 1);
    printf("正在开始打包...n");
    double jindu=NULL; //文件总大小
    double JDbl = NULL;//一个初始值,最大等于文件大小
    double Bai = NULL;//待定
    //赋值
    for (int i = 0; i < Num; i++)
    {
        strcpy(FileIofos[i].FileName, argv[i + 1]);//拷贝文件名  文件名赋值
        XxCc = fopen(FileIofos[i].FileName, "rb");//读取拷贝这个文件
        fseek(XxCc, 0, SEEK_END);  //SEEK_SET  从文件头开始 SEEK_CUR  从当前位置 SEEK_END 从文件尾  
        FileIofos[i].FileSize = ftell(XxCc);//ftell获取文件内容指针到文件头的字节数
        jindu += FileIofos[i].FileSize;
        fclose(XxCc);//关闭文件
    }
    
    
    char buff[32] = { NULL };
    sprintf(buff, "./%c%d%c%c%c%c_%d%c.520XC",//随机文件名
        rand() % 26 + 'a', rand() % 10, rand() % 26 + 'A', rand() % 30 + 'a', rand() % 32 + 'a', rand() % 26 + 'a', rand() % 10, rand() % 38 + 'a');
    FILE* XCdata = fopen(buff, "wb");//打包创建
    //写入内容
    // 1 文件个数
    fwrite(&Num, 1, sizeof(int), XCdata);
    // 2 文件信息 
    fwrite(FileIofos, 1, Num * sizeof(struct MyDbJm), XCdata);
    // 3 文件内容
    int r;
    char temp;
    JDbl = 0;
    for (int n = 0; n < Num; n++)
    {
        XxCc = fopen(FileIofos[n].FileName, "rb");//读取拷贝这个文件
        while (1) { 
            r = fread(&temp, 1, 1, XxCc);//向打包文件写入数据
            if (1 == r) {
                fwrite(&temp, 1, 1, XCdata);
                JDbl++;
            }
            else
                break;
        } 
        fclose(XxCc);
        printf("r已打包:%0.2f﹪",(JDbl/jindu)*100);
    }
    //关闭保存
    fclose(XCdata);
    printf("n打包完成!n正在删除原文件...n");
    for (int x = 0; x < Num; x++)
    {
        DeleteFile(argv[x + 1]);
        printf("r删除进度:%d﹪", mlqz((x / (Num-1))* 100));
        Sleep(10);
    }
    Sleep(500);
    printf("n删除成功!n");
    //文件加密
    //1 创建加密文件
    //char nuff[32];
    //sprintf(nuff, "%s", buff);
    FILE* JM = fopen("./temp.tp", "wb");//创建加密文件
    FILE* ltemp = fopen(buff, "rb");//读取加密文件
    if (NULL == ltemp) { printf("文件打开失败!n"); return -1; }
    //2 进行加密
    int r1;
    char temps;
    int ZJS = 0;
    while (1) {
        if (ZJS % 1024 == 0) { double test = (ZJS / jindu) * 100; if (test >= 100.00) { test = 100.00; }; printf("r正在进行加密:%0.2f﹪", test); }
        r1 = fread(&temps, 1, 1, ltemp);
        if (r1 >= 1) {
            temps ^= key;   //加密
            fwrite(&temps, 1, 1, JM);//加密后
            ZJS += 1;//该文件的字节数
        }
        else
            break;
    }
    //3 关闭文件
    fclose(JM);
    fclose(ltemp);
    //4 删除原来的
    Sleep(100);
    DeleteFile(buff);
    Sleep(100);
    MoveFile("temp.tp", buff);
    printf("n加密成功!n");
    quit(6);
    system("pause");
    return EXIT_SUCCESS;
}
//抹零取正
int mlqz(double a)
{
    double b;
    b = a;
    if (b <= 0) { b= b*(-1); }
    return b;
}
void quit(int n)
{
    printf("%d秒后自动退出...n", n);
    for (int v = n; v >= 0; v--)
    {
        printf("r倒计时:%d秒    ", v);
        Sleep(1000);
    }
    printf("n");
   exit(-1);
}

运行情况:

2.解密解包

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include  
#include
#include
#include
#include
//创建结构体存储打包解包关键信息
struct MyDbJm
{
    char FileName[256];
    int FileSize;
};
void JDt(int n);

int main(int argc, char* argv[])
{   
    int key;
    printf("请输入解密密钥:");
    scanf("%d", &key);
    // 批量解密
    printf("本次获取到了%d个文件待解压n",argc);
    double tg, kb, mb, gb, tb;
        tg =kb=mb=gb=tb= NULL;//统计大小 总大小
    double dog[4080] = { NULL };
    FILE* TG;
    for (int tgs = 1; tgs < argc;)
    {
        TG = fopen(argv[tgs], "rb");
        if (NULL == TG) { printf("文件出错!或者文件可能已损坏!"); return -1; }
        int bv = 0;
        char map = NULL;
        fseek(TG, 0, SEEK_END);  //SEEK_SET  从文件头开始 SEEK_CUR  从当前位置 SEEK_END 从文件尾  
        bv = ftell(TG);
        fseek(TG, 0, SEEK_SET);  //SEEK_SET  从文件头开始 SEEK_CUR  从当前位置 SEEK_END 从文件尾  
        tg += bv;
        dog[tgs] = bv;
        int f;
        int cout = NULL;
        while (1)
        {
           f= fread(&map, 1, 1, TG);
           if (f > 0) {
               cout++;
               if (gb >= 1024) { gb = 0; tb += 1; }
               if (mb >= 1024) { mb = 0; gb += 1; }
               if (kb >= 1024) { kb = 0; mb += 1; }
               if (cout >= 1024) { cout = 0; kb += 1; }
           }
           else 
               break;
        }
        double bfb = (tgs / (argc - 1))*100;
        if (bfb < 0) { bfb *= -1; }
        printf("r正在加载数据...[已加载:%0.2f KB]【%0.2f﹪】     ",(double)(tg/1024),bfb );
        fclose(TG);
        tgs++;
    }
    {
        
        printf("n");
        //printf("加载成功!加载文件总大小:%0.2f KB[%0.2f mb->%0.2f gb->%0.2f tb]",kb,mb,gb,tb );
        if (kb > 0) { printf("加载成功!加载文件总大小:%0.2f KB", kb); }
       else if (mb > 0) { printf("加载成功!加载文件总大小:%0.2f MB", mb); }
       else if (gb > 0) { printf("加载成功!加载文件总大小:%0.2f GB", gb); }
       else if (tb > 0) { printf("加载成功!加载文件总大小:%0.2f TB", tb); }
        printf("n");
    }
    for (int c = 1; c < argc;) {
        double DqJD = NULL, ZJD = NULL, Bai = NULL;
        //解密
        //文件解密
        printf("n正在准备解密第%d个文件...【预计大小】[%0.2f字节]n",c,dog[c]);
        //1 创建解密文件
        FILE* JM = fopen("temp.tp", "wb");//创建解密文件
        FILE* ltemp = fopen(argv[c], "rb");//读取加密文件
        //2 进行加密
        int rn;
        char tempn;
        int ZJS = 0;
        fseek(ltemp, 0, SEEK_END);  //SEEK_SET  从文件头开始 SEEK_CUR  从当前位置 SEEK_END 从文件尾  
        ZJD = ftell(ltemp);
        fseek(ltemp, 0, SEEK_SET);
        printf("正在解密中...n文件名:%sn大小:%0.2f KB [%0.5f MB -> %0.9f GB]n", argv[c], (double)(ZJD / 1024),(double)(ZJD/(1024*1024)), (double)(ZJD / (1024 * 1024*1024)));
        while (1) {
            rn = fread(&tempn, 1, 1, ltemp);
            if (rn > 0) {
                tempn = tempn ^ key;//解密
                fwrite(&tempn, 1, 1, JM);//解密后
                ZJS += 1;//该文件的字节数
                if (ZJS % 1024 == 0) { DqJD = (ZJS / ZJD) * 100; if (DqJD >= 100.00) { DqJD = 100.00; }if (DqJD <= 0) { DqJD *= -1; }; printf("r当前解密进度:%0.2f﹪", DqJD); }
            }
            else
                break;
        }
        //3 关闭文件
        fclose(JM);
        fclose(ltemp);
        if (ZJS != ZJD) { printf("解密失败!"); return -1; }
        else { printf("n解密成功!n正在解包释放文件...n"); }
        //4 删除原来的
        Sleep(100);
        DeleteFile(argv[c]);
        Sleep(100);
        MoveFile("temp.tp", argv[c]);
        
        int FileNum = NULL;//存储文件中读取的文件数量
        //打开打包文件
        FILE* JieBao = fopen(argv[c], "rb");
        //读取文件个数
        fread(&FileNum, 1, sizeof(int), JieBao);
        //建立结构体数组
        struct MyDbJm* FileIofos = (struct MyDbJm*)malloc(FileNum * sizeof(struct MyDbJm));
        //读取打包文件的信息
        fread(FileIofos, 1, FileNum * sizeof(struct MyDbJm), JieBao);
        FILE* XxCc;
        int Mycont = NULL;//声明统计字节数变量
        char temp = NULL;
        //赋值
        for (int i = 0; i < FileNum; i++)
        {
            //1 创建解包文件
            XxCc = fopen(FileIofos[i].FileName, "wb");
            //2 循环 读取文件内容
            Mycont = 0;
            while (1)
            {
                fread(&temp, 1, 1, JieBao);
                fwrite(&temp, 1, 1, XxCc);
                Mycont++;
                if (Mycont >= FileIofos[i].FileSize) break;
            }
            printf("r释放情况:%0.2f﹪【%d/%d】", (double)(((i + 1) / FileNum) * 100), i + 1, FileNum);
            Sleep(100);
            //3 关闭保存
            fclose(XxCc);
        }
        fclose(JieBao);
        DeleteFile(argv[c]);
        printf("n解包成功!n");
        c++;
    }
    for (int i = 5; i > 0; i--) { JDt(i); Sleep(1000); }
    printf("n");
    exit(-1);
    system("pause");
    return EXIT_SUCCESS;
}
void JDt(int n)
{
    printf("r正在退出:->   ");
    for (int i = 0; i < n; i++)
    {
        printf("█");
    }
    printf("    <-     ");
}

运行情况:

温馨提示:属性调节为多字节字符集
打包后情况预览:

属性调节:


笔记总结

提示:这里对文章进行总结:
回顾:
什么是文件 :
硬盘中存储 断电不流失
打开 关闭
读写
字符文件 字节文件:

文件的十二种打开方式

fputc fgetc fputs fgets
printf scanf  gets puts getchar putchar 

文件内容指针:
光标

文件读写的时候,自动调整文件内容指针
如何手动挪文件内容指针
	fseek


	offset  偏移量
		正数  往后偏移
		负数  往前偏移
	origin  偏移起始位置
		文件头  SEEK_SET
		当前    SEEK_CUR
		文件尾  SEEK_END

		feof:文件结束 返回 1  文件没结束 返回 0
		ftell:获取文件内容指针到文件头的字节数
		rewind:文件内容指针挪动到文件头

文件打包解包:

联合:
	struct 结构名{
		成员变量类型 成员变量名;
		成员变量类型 成员变量名;
		成员变量类型 成员变量名;
	};
	union 联合名{
		成员变量类型 成员变量名;
		成员变量类型 成员变量名;
		成员变量类型 成员变量名;
	};
	联合的所有成员共用同一块内存。共同体 共用体

	使用联合可以快速拆分
枚举:就是为了起名字
	一次性定义多个名字
	声明定义和结构体相同
	但使用和结构体不同,直接使用枚举成员

C语言中没有bool类型:
	1  true  0 false

添加头文件 stdbool.h

位段:
	struct test{
		int n : 1;
		int m : 2;
	};

	为了灵活分配内存
	````





转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/971329.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号