我在stephan-brumme网站上关于XOR加密的教程(遗憾的是我不能包含URL因为我没有足够的声誉)。我想要做的是:阅读example.txt文件的内容并解密它包含的文本。例如,这是example.txt的内容:
<!DOCTYPE html5>
当使用密码&#34;密码&#34;解密时应该回来&#34;你好&#34;。这是我得到的代码:
\xe7\xfb\xe0\xe0\xe7
这是运行应用程序的结果: click for image
如您所见,解密未成功。现在,如果我这样做它不会读取.txt,而是直接解密文本,如下所示:
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
std::string decode(const std::string& input)
{
const size_t passwordLength = 9;
static const char password[passwordLength] = "password";
std::string result = input;
for (size_t i = 0; i < input.length(); i++)
result[i] ^= ~password[i % passwordLength];
return result;
}
int main(int argc, char* argv[])
{
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( getline (myfile,line) )
{
cout << decode(line);
}
myfile.close();
}
return 0;
}
完美无缺: click for image
我在这里做错了什么?
非常感谢提前! :)
答案 0 :(得分:1)
我打赌example.txt包含字符'\','x','e','7'等等。您必须阅读这些字符,处理所有反斜杠转义符,然后然后提要它解码。
\ xe7是用十六进制值E7表示单个字符的常用方法。 (这很可能是单个字符'ç',具体取决于你的字符集)。如果你想存储(加密)可读文本,我建议删除\ x,并让文件包含像“e7fbe0e0e7”这样的行。然后 - 将每一行读成一个字符串。 - 将每对字符从十六进制数转换为整数,并将结果存储在char中。 - 将该字符串存储在字符串中。 - 然后xor解密字符串。
或者,确保文件包含您需要的实际二进制字符。
还要注意您正在使用密码的终止空字节进行异或。你的意思是这样做吗?
答案 1 :(得分:1)
相同字符的字符XOR为零,因此结果可能包括零。 std::string
不喜欢这样,因为零终止字符串。
您还可以使用std::vector<char>
代替std::string
进行实际编码/解码。您必须更改decode
函数才能处理vector<char>
以二进制文件读/写文件。
修改:仅使用std::string
和std::string decode(const std::string& input)
int main()
{
std::string line = "hello";
{
line = decode(line);
std::ofstream myfile("example.txt", std::ios::binary);
myfile.write(line.data(), line.size());
//Edit 2 *************
//std::cout << std::hex;
//for (char c : line)
// std::cout << "\\x" << (0xff & c);
//*************
//This will make sure width is always 2
//For example, it will print "\x01\x02" instead of "\x1\x2"
std::cout << std::hex << std::setfill('0');
for (char c : line)
std::cout << "\\x" << std::setw(2) << (0xff & c);
std::cout << std::endl;
}
{
std::ifstream myfile("example.txt", std::ios::binary | std::ios::ate);
int filesize = (int)myfile.tellg();
line.resize(filesize);
myfile.seekg(0);
myfile.read(&line[0], filesize);
line = decode(line);
std::cout << line << std::endl;
}
return 0;
}