从简单的加密文件C ++中读取

时间:2014-05-21 12:17:13

标签: c++ encryption

我正在尝试编写一个程序,它将一个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

可能保存文件会导致保存的字节出现问题,因此当程序尝试读取字符串时,它无法检索相同的字节,但我根本不确定。

祝你好运

3 个答案:

答案 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