【问题标题】:C++ XOR encryption truncates fileC ++ XOR加密截断文件
【发布时间】: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


【解决方案1】:

XOR 可以产生零个字符,std::string 将其解释为行尾

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

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

我看到您使用的是std::ostream::write(),所以我看到您已经熟悉使用大小作为参数。那么为什么不也使用std::istream::read() 而不是std::getline()

因此,您可以简单地读入文件的“块”或“块”,而不需要将行分隔符视为特殊情况。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多