我正在尝试编写一个程序,它将一个XOR加密字符串输出到一个文件,并将读取该字符串并将其解密。为了加密我的字符串,我使用了一个简单的XOR加密:(感谢Kyle W.Banks site)
string encryptDecrypt(string toEncrypt)
{
char key = 'K'; //Any char will work
string output = toEncrypt;
for (int i = 0; i < toEncrypt.size(); i++)
output[i] = toEncrypt[i] ^ key;
return output;
}
然后在我的程序中,我使用以下代码编写然后读取字符串:
string encrypted = encryptDecrypt("Some text");
cout << "Encrypted:" << encrypted << "\n";
ofstream myFile("test.txt");
myFile << encrypted;
// Read all the txt file in binary mode to obtain the txt file in one string
streampos size;
char * memblock;
ifstream file ("test.txt", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
}
//Convert the memblock into string and show the result of decrypted string
string result(memblock);
string decrypted = encryptDecrypt(result);
cout << "Decrypted:" << decrypted << "\n";
结果我有:
Encrypted : ,<.c%.;%
Decrypted : Õ52E65AD0
可能保存文件会导致保存的字节出现问题,因此当程序尝试读取字符串时,它无法检索相同的字节,但我根本不确定。
祝你好运
答案 0 :(得分:1)
由于您未关闭输出,因此您的操作系统很可能无法打开文件进行阅读。
无论文件是否被成功读取,您都要进行解密
如果它没有被成功读取,由于memblock
没有被初始化,你将会有未定义的行为 - 最有可能从随机垃圾数据构建result
。
修复后,您需要将memblock
置零,以使其成为正确的&#34; C风格的字符串。
答案 1 :(得分:1)
使用XOR进行加密有点危险。假设您的纯文本包含字母'K',加密的字符串将在此位置包含'\0'
。你的字符串会被切断。
对于另一个方向,您正在读取加密的字符串。将内存块转换为字符串将导致字符串变短,因为std::string::string(const char*)
将停止在'\0'
处读取。
除此之外,当文件无法打开时,memblock
未初始化,因此将加密部分放入if(file.IsOpen())子句中。
答案 2 :(得分:0)
正如Zuppa所说,使用它是危险的,因为'\ 0'的字符串可能会意外终止 你应该发布 - 计算你正在处理它的文本的长度可以通过使用stream.seekg(0,ios_base :: end)
轻松完成您可以使用读写函数来编写或从文件中获取文本
ifstream file ("test.txt", ios::in|ios::binary|ios::ate);
file.seekg(0,ios::end);
int length=file.tellg();//length of the text in the file
file.seekg(0);
char *memblock=new char[length];
file.read(memblock,length);
您可以参考此Simple xor encryption