.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::fstreamctor 的第二个参数) 我会调查并回复,谢谢。 工作就像一个魅力!谢谢! 【参考方案1】:

当您创建 std::ofstreamstd::istream 对象时,您使用 2 个参数 ctor,但第二个参数具有默认值(std::ios::instd::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++的主要内容,如果未能解决你的问题,请参考以下文章

ascii编码字符串中的Python十六进制值

Perforce unicode问题:使用非ascii字符的同步文件会导致截断

Bash-将输出重定向到文件时处理退格控制字符

linux中如何将us-ascii转换成utf-8格式

ASCII中的控制字符含义

从 Lambda 中的 S3 通知事件获取非 ASCII 文件名