只是简单的循环异或加密文件,以异或的特性,对加密后的文件再进行一次异或操作以后,又能将文件还原。
参考并整理了一下网络上的资源,现将代码备份如下。
.cpp文件
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string>
using namespace std;
bool SimpleXor(const string&info, const string& key, string* result)
{
if (result==NULL || info.empty() || key.empty())
return false;
//清空结果字符串
result->clear();
unsigned long i=0;
unsigned long j=0;
for (;i<info.size();++i) {
//逐字加密
result->push_back(static_cast<unsigned char>(info[i]^key[j]));
//循环密钥
j=(j+i)%(key.length());
}
return true;
}
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("no file input!!!\n");
system("PAUSE");
return 0;
}
//读取输入的文件名
string filename = argv[1];
cout<<filename;
//读取文件
ifstream in(filename, ios::in);
istreambuf_iterator<char> beg(in), end;
string str(beg, end);
in.close();
//对读取的文件进行加密处理
string key = "this is my key";
string ret = "";
SimpleXor(str, key, &ret);
//重新打开原文件 将加密后的内容覆盖进去
fstream fout(filename,ios::out);
fout.write(ret.c_str(),ret.length());
fout.close();
cout<<"="<<ret.length()<<"byte"<<endl;
system("PAUSE");
return 0;
}
以上cpp暂命名为test.cpp,接下来要进行编译\链接,生成可执行文件
因为懒得打开编辑器,所以选择用命令行处理,写一个bat文件
--------------------------------------------------------------------
.bat文件
set path=D:/tools/Microsoft Visual Studio 12.0/VC/bin;D:/tools/Microsoft Visual Studio 12.0/Common7/IDE
set include=D:/tools/Microsoft Visual Studio 12.0/VC/include
set lib=D:/tools/Microsoft Visual Studio 12.0/VC/lib;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
cl test.cpp
--------------------------------------------------------------------
如上处理以后,生成了一个test.exe
这时候如果直接运行.exe会在窗口输出
"no file input!!!"
这是因为刚刚的cpp代码中,main函数需要传入你要加密的文件
我本意是需要用批处理来调用,因为不可能加密的时候一个一个手书文件名吧
调用方式 :
命令行输入 test.exe "myfile.txt"