C ++,我希望能够使用字符“ XOR”和键“ 1”来“加密”和解密.txt文件。
我能够成功加密和解密“ Hello World”,但较大的文本文件似乎具有一些映射到Ascii控制字符的XOR,这些XOR会导致解密无法完全解密整个文件。
Hello.txt包含“ Hello World”,output.txt为空。
我如何:
std::ifstream infile("Hello.txt");
std::ofstream outfile("output.txt");
std::string key = "1";
std::string contents((std::istreambuf_iterator<char>(infile)),
std::istreambuf_iterator<char>()); //copies file data to contents
infile.close();
int k = 0;
for(std::size_t i = 0; i<contents.length();i++) //character by character
{
contents[i] = contents[i] ^ key[k]; //"encrypt"
k = (k+1) % key.length(); //iterate through key (for longer keys)
outfile <<contents[i]; //write to output.txt
}
outfile.close();
使用相同的代码解密output.txt,但是需要更改infile和outfile的硬代码。例如。infile(“ output.txt”),outfile(“ text.txt”);
如果文件包含字符“ +”,则使用键“ 1”将“ +”加密为“”(→),并且解密将截断“ +”之后的所有内容(包括首尾)。
我是否正确地认为,.txt文件无法处理的对Ascii控制字符的某些值XOR(Windows 10)?
使用使用.txt文件保存密文的方法,是否可以正确地“加密”和解密?
如果可能,如何将Ascii控制字符存储到.txt文件?
我应该更改什么以更好地处理密文中的Ascii控制字符?
当您创建一个std::ofstream
或std::istream
对象时,使用2个参数ctor,但是第二个参数具有默认值(std::ios::in
且分别为std::ios::out
),并且默认情况下会以“文本”模式打开文件,这在Windows上将启用控制字符处理并将其映射\r
到“ \ r” \ n”,反之亦然。
因此,显式传递第二个参数:
std::ofstream outfile("output.txt", std::ios::out | std::ios::binary);
这将以“二进制”模式打开它们,所有数据将不更改地通过。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句