查看: 433|回复: 6

[C/C++] C/C++实现对目录下的文件加密

[复制链接]

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

发表于 2023-1-12 11:53:25 | 显示全部楼层 |阅读模式
本帖最后由 YFSafe 于 2023-1-12 11:57 编辑

这是我们2021年左右写的一个东西,所以码风很凌乱

这个程序实现了对它自己所在目录下的文件和文件夹中的文件进行加密(递归搜索)
加密部分的逻辑:读取文件内容到缓冲区->对缓冲区内的内容异或加密->创建文件名为(原文件名+.enc后缀)的文件,并将缓冲区的内容写入文件->删除原文件
源代码:
[C++] 纯文本查看 复制代码
#include <iostream>
#include <fstream>
#include<cstdlib>
#include<string>
#include<io.h>
#include<stdio.h>
#include<vector>
using namespace std;

char key[] = "2Jdh2ercih48&qiecBerxlr,xwiefhmjn%wHJTqrxlwHJVSun@19510";

bool IsEncry = false;//是否需要加密

bool AreTheFilenamesEqual(const char *s, char *den)
{
    return strrchr(s, '.')&&(strcmp(strrchr(s, '.'), den)==0);
}//比较两个文件名的后缀是否相等

int EncryptSimpleFile(string path)//加密单文件
{
    cout << path <<endl;
    string path1, path2;
    if(encry)
    {
        path1 = path;
        path2 = path+"enc";
    }
    else
    {
                path1 = path;
            path2 = path1.substr(0, path1.length()-3);
        }
    cout << path1 << "------>" << path2 << endl;
    FILE *f = fopen(path1.c_str(), "rb");
    FILE *fw = fopen(path2.c_str(), "wb");
    const int buffer_size = 1024;
    int read_size = 0;
    char buffer[1024+1] = {0};
int i;
memset(buffer, 0, buffer_size+1);
    while (read_size = fread(buffer, sizeof (char), buffer_size, f)) {
        for(i = 0; i<read_size; i++){
            buffer[i] ^= key[i%strlen(key)];
        }//分片读取文件,所以不会爆缓冲区
        fwrite(buffer, sizeof (char), read_size, fw);//写入文件
    }
    fclose(f);
    fclose(fw);
    remove(path1.c_str());
    return 0;
}

void encry_deencry(vector<string> &file)//解密模块
{
    if(!encry)
    {
        cout<<"please input password:"<<endl;
        char tempkey[105] = {0};
        cin>>tempkey;
        if(strcmp(tempkey, key) != 0)
            return;
        else{
            cout << "Right!" << endl;
        }
    }
    for(vector<string>::iterator filei=file.begin(); filei != file.end(); ++filei)
    {
        string filej = *filei;

//其实这两个的处理逻辑是一样的,我也不知道当初为什么要这么写
        if(IsEncry && (AreTheFilenamesEqual(filej.c_str(), ".txt"))||(AreTheFilenamesEqual(filej.c_str(), ".docx"))||(AreTheFilenamesEqual(filej.c_str(), ".doc"))||(AreTheFilenamesEqual(filej.c_str(), ".ppt"))||(AreTheFilenamesEqual(filej.c_str(), ".pptx"))||(AreTheFilenamesEqual(filej.c_str(), ".xls"))||(AreTheFilenamesEqual(filej.c_str(), ".xlsx"))||(AreTheFilenamesEqual(filej.c_str(), ".cmd")))//如果未加密
EncryptSimpleFile(filej);

        if((!IsEncry) && (AreTheFilenamesEqual(filej.c_str(), ".txtenc"))||(AreTheFilenamesEqual(filej.c_str(), ".docxenc"))||(AreTheFilenamesEqual(filej.c_str(), ".docenc"))||(AreTheFilenamesEqual(filej.c_str(), ".pptenc"))||(AreTheFilenamesEqual(filej.c_str(), ".pptxenc"))||(AreTheFilenamesEqual(filej.c_str(), ".xlsenc"))||(AreTheFilenamesEqual(filej.c_str(), ".xlsxenc"))||(AreTheFilenamesEqual(filej.c_str(), ".cmdenc")))如果已被加密
EncryptSimpleFile(filej);

    }
}

void PushAllFile(string path, vector<string> &file_set)//对所有文件的处理
{
    long hFile = 0;
    struct _finddata_t fileInfo;
    string pathName;
    if((hFile = _findfirst(pathName.assign(path).append("\\*").c_str(), &fileInfo)) == -1) return;
    do{
        if( strcmp(fileInfo.name,"..") && strcmp(fileInfo.name,".") && fileInfo.attrib==_A_SUBDIR )
PushAllFile(path+"\\"+fileInfo.name, file_set);

        if (AreTheFilenamesEqual(fileInfo.name, ".txt") || AreTheFilenamesEqual(fileInfo.name, ".docx") || AreTheFilenamesEqual(fileInfo.name, ".doc") || AreTheFilenamesEqual(fileInfo.name, ".ppt") || AreTheFilenamesEqual(fileInfo.name, ".pptx") || AreTheFilenamesEqual(fileInfo.name, ".xls") || AreTheFilenamesEqual(fileInfo.name, ".xlsx") || AreTheFilenamesEqual(fileInfo.name, ".cmd"))
        {
IsEncry = true;//需要加密
            file_set.push_back(path+"\\"+fileInfo.name);
        }

else if(AreTheFilenamesEqual(fileInfo.name, ".txtenc") || AreTheFilenamesEqual(fileInfo.name, ".docxenc") || AreTheFilenamesEqual(fileInfo.name, ".docenc") || AreTheFilenamesEqual(fileInfo.name, ".pptenc") || AreTheFilenamesEqual(fileInfo.name, ".pptxenc") || AreTheFilenamesEqual(fileInfo.name, ".xlsenc") || AreTheFilenamesEqual(fileInfo.name, ".xlsxenc") || AreTheFilenamesEqual(fileInfo.name, ".cmdenc"))
{
            file_set.push_back(path+"\\"+fileInfo.name);
        }

    }while(_findnext(hFile, &fileInfo)==0);
    _findclose(hFile);
    return;
}
 
int main()
{
    vector<string> file_set;

PushAllFile(".", file_set);
    encry_deencry(file_set);
    return 0;
}

评分

参与人数 2经验 +10 人气 +1 分享 +1 收起 理由
usr + 1 支持开源!
蒟蒻 + 10 + 1 严格按照你的标准给

查看全部评分

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7734
人气
176
分享
52

最佳新人活跃会员

发表于 2023-1-12 18:28:40 | 显示全部楼层
代码风确实有点乱
“AreTheFilenamesEqual”这个叫“checkFilename”不香么
小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6867
人气
208
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2023-1-14 21:24:45 | 显示全部楼层
编译环境有什么要求不
论坛事务联系邮箱 henry217@x64bbs.cn

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

 楼主| 发表于 2023-1-14 22:27:40 | 显示全部楼层
henry217 发表于 2023-1-14 21:24
编译环境有什么要求不

我们当时用的devc++编译的
其余没有什么要求
vs改一下代码就行
YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

0

魅力

2

原创

初出茅庐

Rank: 2

积分
238
人气
18
分享
2
发表于 2023-1-15 06:45:26 | 显示全部楼层
支持开源!感谢分享!

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6867
人气
208
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2023-1-15 21:27:22 | 显示全部楼层
YFSafe 发表于 2023-1-14 22:27
我们当时用的devc++编译的
其余没有什么要求
vs改一下代码就行

正好我没装msvc
论坛事务联系邮箱 henry217@x64bbs.cn

1

技术

7

魅力

2

原创

管理员

Rank: 9Rank: 9Rank: 9

积分
6867
人气
208
分享
49

灌水之王论坛元老优秀版主活跃会员

发表于 2023-1-19 11:10:54 | 显示全部楼层
你其实可以试一下aes算法
openssl里有
论坛事务联系邮箱 henry217@x64bbs.cn
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表