为什么我的简单XOR加密程序不能正确转换字符,为什么它最后会添加更多字符?

Jan*_*man 0 c++ encryption xor

我正在制作一个基于XOR的en/decryptor,就像这样工作.你有一个明文字符,例如3,和一个用户密钥,例如5.写入位:

3 = 00000011

5 = 00000101
Run Code Online (Sandbox Code Playgroud)

现在,如果我们进行XOR操作,我们得到6:

6 = 00000110
Run Code Online (Sandbox Code Playgroud)

这可以通过说6 XOR 5(即3)来反转.

所以我做了这个程序.但它确实有错误,它不会正确翻译文本,并且它会在文件的末尾添加许多字符,具体取决于您使用的是哪个键.

using namespace std;
int main(int argc, char *argv[])
{
    char buffer[5001]; 
    ifstream fin("a.txt", ifstream::in);
    ofstream fout("b.txt");
    int key;
    char znak;

    // console    
    cout << "Key: ";
    cin >> key;
    fin.get(znak);
    while(!fin.eof() && znak != ' ')
    {
       fin.get(buffer, sizeof(buffer));     
    }

    for(int i = 0; i < sizeof(buffer); i++)
    {
       fout << function(key, buffer[i]);
    }

    cout << "done" << endl;

    cin.get();
    return 0;
}

char function(int key,char input)
{
    return input ^ key;
}
Run Code Online (Sandbox Code Playgroud)

为什么程序不正确翻译文本?为什么它会在文件末尾添加字符?

Jer*_*fin 7

从外观来看,加密几乎与任何事情(或至少与问题无关)在这里.

while(!fin.eof() && znak != ' ')
Run Code Online (Sandbox Code Playgroud)

表单的循环while (!whatever.eof())几乎可以保证不正常工作.

    fin.get(buffer, sizeof(buffer)); 
Run Code Online (Sandbox Code Playgroud)

当你做,请注意,它并不能保证它会读取sizeof(buffer)字符-只是它不会读取任何比.您通常会在文件末尾获得更少的内容,而只是没有那么多字符可供阅读.[编辑:我还要提到的是,你可以阅读在其他地方少,以及-例如,如果你从网络连接读,这是相当普遍接受的部分缓冲区,但是当它到达更晚.]

for(int i = 0; i < sizeof(buffer); i++)
Run Code Online (Sandbox Code Playgroud)

所以在这里,当你尝试处理sizeof(buffer)字符时,很可能(特别是在最后一次迭代中)你试图处理的字符多于实际读取的字符.您可以检索您阅读的号码gcount,但我不确定我是否真的建议您使用它.

就个人而言,我可能会这样做:

class function { 
    char key;
public:
    function(char k) : key(k) { }
    char operator()(char input) { return key ^ input; }
};

int main() { 
    std::ifstream fin("a.txt");
    std::ofstream fout("b.txt");

    fin.noskipws();

    std::transform(std::istream_iterator<char>(fin),
                   std::istream_iterator<char>(),
                   std::ostream_iterator<char>(fout),
                   function(key));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)