.txt 文件中的 Ascii 控制字符问题、XOR 加密、C++
Posted
技术标签:
【中文标题】.txt 文件中的 Ascii 控制字符问题、XOR 加密、C++【英文标题】:Issues with Ascii Control Characters in .txt files, XOR encryption, C++ 【发布时间】:2021-01-04 22:34:50 【问题描述】:C++,我希望能够“加密”和解密 .txt 文件,使用逐个字符的 XOR 和密钥 “1”。
我能够成功加密和解密“Hello World”,但较大的文本文件似乎有一些 XOR 映射到 Ascii 控制字符,导致解密无法完全解密整个文件。
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”,“+”将加密为“”(→),解密将截断“+”之后的所有内容,包括在内。
我认为某些值 XOR 到 Ascii 控制 .txt 文件无法处理的字符(Windows 10)是否正确?
是否可以通过我使用 .txt 文件保存密文的方法正确“加密”和解密?
如果可能,我如何将 Ascii 控制字符存储到 .txt 文件中?
我应该改变什么来更好地处理密文中的 Ascii 控制字符?
【问题讨论】:
在两种情况下都只以二进制而不是文本的形式打开加密文件(std::fstream
ctor 的第二个参数)
我会调查并回复,谢谢。
工作就像一个魅力!谢谢!
【参考方案1】:
当您创建 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);
这将以“二进制”模式打开它们,所有数据都将通过而不改变。
【讨论】:
【参考方案2】:以二进制形式打开文件可以解决问题。
std::ifstream infile("Hello.txt",std::ios::binary); //<---- here
std::ofstream outfile("output.txt",std::ios::binary); //<----- here
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();
【讨论】:
以上是关于.txt 文件中的 Ascii 控制字符问题、XOR 加密、C++的主要内容,如果未能解决你的问题,请参考以下文章