C ++ XOR加密截断文件

时间:2016-03-01 17:42:28

标签: c++ file encryption file-io xor

我目前正在尝试通过XOR实现文件加密。虽然很简单,但我很难加密多行文件 实际上,我的第一个问题是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;
}

如果控制台输入异或,那可能是什么问题?

1 个答案:

答案 0 :(得分:1)

  

XOR可以产生零个字符,由std::string

解释为行尾

std::string为大多数功能提供重载,允许您指定输入数据的大小。它还允许您检查存储数据的大小。因此,char内的0值std::string是完全合理且可接受的。

因此,问题不是std::string将空值视为行尾但可能std::getline()可能正在这样做。

我发现你正在使用std::ostream::write()所以我发现你已经熟悉使用尺寸作为参数。那么为什么不使用std::istream::read()代替std::getline()

因此,您只需读取文件的“块”或“块”,而不是将行分隔符视为特殊情况。