近来写了一个有关加密文本的加密程序,基本原理是将文件中所有字节和指定的密码逐字节进行异或,一般文件内容远远长于密码,那么可以扩展密码为:123456123456…这种循环的形式,直到和原文件相同的长度。这样所有文件的内容对被密码加密了,而且由于异或的特性,只需要再执行一下加密的过程,原文件内容就可以被恢复。

下面写一下实现的具体功能,主要函数和效果:

程序可以将程序文件所在文件夹以及子文件夹下,所有后缀为txt和docx的文件进行加密,加密文件后缀变为txtenc,docxenc如果存在需要加密的文件则进行加密(加密文件和未加密文件都在文件夹下时也进行加密),如果所有txt和docx文件都是加密文件,那就通过像用户询问密码来确认是否解密。

vector<string> file_set;

这里定义了一个字符串数组,来存储文件夹下所有满足要求的文件名。

void handle_all_file(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 )handle_all_file(path+"\\"+fileInfo.name, file_set);if (compare_file_name(fileInfo.name, ".txt") || compare_file_name(fileInfo.name, ".docx")){encry = true;file_set.push_back(path+"\\"+fileInfo.name);}else if(compare_file_name(fileInfo.name, ".txtenc") || compare_file_name(fileInfo.name, ".docxenc")){file_set.push_back(path+"\\"+fileInfo.name);}}while(_findnext(hFile, &fileInfo)==0);_findclose(hFile);return;
}

这里通过结构体_finddata_t来列出所有文件名,它的使用参考了

https://blog.csdn.net/godop/article/details/81080835

compare_file_name是对文件名后缀简单判断,存在符合要求的未加密文件时,让一个全局bool变量encry赋予值true,用于判断执行加密过程还是解密。这个函数将加密文件和未加密文件都挑选出来,所以后继需要根据encry的值判断是对加密文件解密还是对未加密文件加密。

void encry_deencry(vector<string> &file)
{if(!encry){cout<<"please input password:"<<endl;char tempkey[10] = {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(encry && (compare_file_name(filej.c_str(), ".txt"))||(compare_file_name(filej.c_str(), ".docx")))handle_one_file(filej);if((!encry) && (compare_file_name(filej.c_str(), ".txtenc"))||(compare_file_name(filej.c_str(), ".docxenc")))handle_one_file(filej);}
}

这个函数是询问密码判断密码是否正确,再度挑选出合适的文件,进行处理。

int handle_one_file(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;
}

通过C语言的fopen,fread,fwrite,读出文件然后通过key[i%strlen(key)]循环地用密码取异或原始文件内容。

效果如下:

完整代码如下:

#include <iostream>
#include <fstream>
#include<cstdlib>
#include<string>
#include<io.h>
#include<stdio.h>
#include<vector>
using namespace std;char key[] = "123456";bool encry = false;bool compare_file_name(const char *s, char *den)
{return strrchr(s, '.')&&(strcmp(strrchr(s, '.'), den)==0);
}int handle_one_file(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[10] = {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(encry && (compare_file_name(filej.c_str(), ".txt"))||(compare_file_name(filej.c_str(), ".docx")))handle_one_file(filej);if((!encry) && (compare_file_name(filej.c_str(), ".txtenc"))||(compare_file_name(filej.c_str(), ".docxenc")))handle_one_file(filej);}
}void handle_all_file(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 )handle_all_file(path+"\\"+fileInfo.name, file_set);if (compare_file_name(fileInfo.name, ".txt") || compare_file_name(fileInfo.name, ".docx")){encry = true;file_set.push_back(path+"\\"+fileInfo.name);}else if(compare_file_name(fileInfo.name, ".txtenc") || compare_file_name(fileInfo.name, ".docxenc")){file_set.push_back(path+"\\"+fileInfo.name);}}while(_findnext(hFile, &fileInfo)==0);_findclose(hFile);return;
}int main()
{vector<string> file_set;handle_all_file(".", file_set);encry_deencry(file_set);return 0;
}

C++实现的一个加密文件的程序相关推荐

  1. 习题 8.5 将本章的例8.4改写为一个多文件的程序:1.将类定义放在头文件arraymax.h中;2.将成员函数定义放在源文件arraymax.cpp中;3.主函数放在源文件file1.cpp中。

    C++程序设计(第三版) 谭浩强 习题8.5 个人设计 习题 8.5 将本章的例8.4改写为一个多文件的程序: 1.将类定义放在头文件arraymax.h中: 2.将成员函数定义放在源文件arraym ...

  2. 如何用脚本创建一个加密文件夹

    要用脚本创建一个加密文件夹,首先需要有一个脚本语言的编辑器,比如 Python.然后,你需要使用 Python 的 os 模块来创建文件夹.例如,可以使用 os.mkdir 函数来创建文件夹,如下所示 ...

  3. 我的一个关于文件的程序 - [C语言]

    2005-09-05 我的一个关于文件的程序 - [C语言] #include<stdio.h> void main() { char ch; FILE* fp; if((fp=fopen ...

  4. 在 Linux 上创建一个加密文件保险库

    关注微信公众号:厦门微思网络 最近,我演示了如何在 Linux 上使用统一密钥设置(Linux Unified Key Setup)(LUKS)和 cryptsetup 命令 实现全盘加密.虽然加密整 ...

  5. python 编写一个局域网文件传输的程序

    可以使用 Python 的 socket 模块来编写一个局域网文件传输程序. 首先,你需要在服务端程序中创建一个 socket 对象,并绑定到特定的 IP 地址和端口上.然后,服务端可以通过调用 so ...

  6. linux命令文件加密软件,Linux系统下如何加密文件,简单实用的文件管理器GnuPG

    我们知道,Linux 桌面版和服务器版具有卓越的安全性.然而这并不意味着你可以放松警惕.你应该一直认为你的数据总是很快就会被破坏.也就是说,你可能需要使用各种加密工具.比如 GnuPG,它可以让你加密 ...

  7. Linux简单的文件管理器设计,桌面应用|如何从 Linux 的文件管理器中加密文件

    Linux 桌面版和服务器版具有卓越的安全性.然而这并不意味着你可以放松警惕.你应该一直认为你的数据总是很快就会被破坏.也就是说,你可能需要使用各种加密工具.比如 GnuPG,它可以让你加密和解密文件 ...

  8. Linux无文件木马程序渗透测试复现

    今天继续给大家介绍渗透测试相关知识,本文主要内容是Linux无文件木马程序渗透测试复现. 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强 ...

  9. 用C++编写的垃圾文件清理程序,这下电脑速度快多了!

    想必每个人电脑桌面上都会有一个垃圾文件清除器,这使得它很容易快速找到并擦干您计算机上的所有垃圾文件.它快速的扫描您的硬盘,然后显示垃圾文件,这样你就可以决定他们想要删除.程序精确地检测和识别只有垃圾文 ...

  10. springboot md5加密_实在!基于Springboot和WebScoket,写了一个在线聊天小程序

    基于Springboot和WebScoket写的一个在线聊天小程序 (好几天没有写东西了,也没有去练手了,就看了看这个...) 项目说明 此项目为一个聊天的小demo,采用springboot+web ...

最新文章

  1. JDBC驱动程序的四种方式
  2. Oracle 中对表空间使用情况进行查询
  3. OpenCV-裁剪图片
  4. C++ Primer 5th笔记(chap 15 OOP)虚函数
  5. wxWidgets:wxOwnerDrawnComboBox类用法
  6. ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
  7. 信息学奥赛一本通(1411:区间内的真素数)
  8. (转)shiro权限框架详解05-shiro授权
  9. 保存最大的前20项暴力--Heritage of skywalkert
  10. vs2017安装QT开发插件
  11. 最大值减最小值等于区间长度_一文帮你弄清楚电压和电流的有效值、瞬时值、平均值、最大值及其关系...
  12. 【Word】插入公式显示灰色,失效解决
  13. 计算机网络常见简答题
  14. 【Java分享客栈】我为什么极力推荐XXL-JOB作为中小厂的分布式任务调度平台
  15. 之江汇空间如何加音乐背景_如何给空间添加背景音乐
  16. Baumer工业相机堡盟工业相机如何联合BGAPISDK和佳能EF变焦镜头实现相机的自动变焦(C#)
  17. 雷电模拟器连接android studio教程
  18. 西门子real是什么数据类型_西门子数据类型REAL转WORD和S5TIME的方法
  19. PCIe PCS sublayer
  20. 基于电影爬虫及Spark数据分析可视化设计

热门文章

  1. 【转载】装机知识显卡篇,一篇文章让小白透彻的了解显卡
  2. Python微信库:itchat的用法详解
  3. 网络安全应急响应(文末附应急工具)
  4. FPGA实现对数log2和10*log10
  5. QPainter图像混合
  6. 计算机语言异或符号,异或门的电路符号表达_XOR的电路实现
  7. JS跨域请求解决方案
  8. 用计算机用图解法求理论塔板数,简洁法计算理论板数工具
  9. 工业交换机在智能交通电子警察系统解决方案的应用
  10. 神舟战神z7-ct7nt的键盘灯控制不了的解决