【发布时间】:2016-06-14 06:34:21
【问题描述】:
我目前正在尝试通过 XOR 实现文件加密。虽然它很简单,但我在 multiline 文件的加密方面遇到了困难。
实际上,我的第一个问题是 XOR 可以产生零字符,std::string 将其解释为行尾,因此我的解决方案是:
std::string Encryption::encrypt_string(const std::string& text)
{ //encrypting string
std::string result = text;
int j = 0;
for(int i = 0; i < result.length(); i++)
{
result[i] = 1 + (result[i] ^ code[j]);
assert(result[i] != 0);
j++;
if(j == code.length())
j = 0;
}
return result;
}
std::string Encryption::decrypt_string(const std::string& text)
{ // decrypting string
std::string result = text;
int j = 0;
for(int i = 0; i < result.length(); i++)
{
result[i] = (result[i] - 1) ^ code[j];
assert(result[i] != 0);
j++;
if(j == code.length())
j = 0;
}
return result;
}
不整洁,但适合第一次尝试。但是,当我尝试加密文本文件时,我明白,根据加密密钥,我的输出文件会在随机位置被截断。我最好的想法是,\n 处理不正确,因为来自键盘的字符串(即使使用\n)不会破坏代码。
bool Encryption::crypt(const std::string& input_filename, const std::string& output_filename, bool encrypt)
{ //My file function
std::fstream finput, foutput;
finput.open(input_filename, std::fstream::in);
foutput.open(output_filename, std::fstream::out);
if (finput.is_open() && foutput.is_open())
{
std::string str;
while (!finput.eof())
{
std::getline(finput, str);
if (encrypt)
str.append("\n");
std::string encrypted = encrypt ? encrypt_string(str) : decrypt_string(str);
foutput.write(encrypted.c_str(), str.length());
}
finput.close();
foutput.close();
return true;
}
return false;
}
考虑到控制台输入是 XOR 的,这可能是什么问题?
【问题讨论】:
-
getline()使用'\n'(新行)字符。您应该使用std::ifstream::read()函数读取您的文件。 -
在字符串中包含
\0很好,您只需要小心不要使用将其用作字符串结尾标记的函数。如果您只是使用字符串并按照示例中的方式调用 write(使用.c_str()或.data()和.length()),那么您应该没问题。 -
πάντα-ῥεῖ 是对的,如果你只对
multiline文件有问题,你应该在处理行尾时寻找你的问题! -
处理二进制数据(而不是字符数据)时,必须使用字节缓冲区(无符号字符数组)而不是字符串。
标签: c++ file encryption file-io xor