尝试读取文本文件,使用XOR加密,然后将其写入新的文本文件

时间:2012-05-28 07:12:07

标签: c++ encryption bit-manipulation xor

我正在尝试设计一个程序,它将打开任何文本文件,将其读入字符串,使用XOR加密字符串,并将字符串写入新的文本文件。下面的代码有效,但会产生多个“系统蜂鸣声”。

我的猜测是我没有正确处理空格?我不确定。我有什么想法吗?

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
    ifstream inFile;
    ofstream outFile;

    // Define variables
    string fileName,
        key = "seacrest out";

    // Input
    cout << "Please enter the name of the file you wish to encrypt: ";
    cin >> fileName;
    cout << endl;

    inFile.open(fileName, ios::in | ios::binary);
    string str((istreambuf_iterator<char>(inFile)), istreambuf_iterator<char>()); // Reads a text file into a single string.
    inFile.close();
    cout << "The file has been read into memory as follows:" << endl;   
    cout << str << endl;
    system("pause");

    // Encryption
    cout << "The file has been encrypted as follows:" << endl;
    for (unsigned x = 0; x < str.size(); x++)           // Steps through the characters of the string.
        str[x] ^= key[x % key.size()];                  // Cycles through a multi-character encryption key, and encrypts the character using an XOR bitwise encryption.
    cout << str << endl;                                // This code works, but I get system beeps. Something is still wrong.

    // Write Encrypted File
    cout << "Please enter the file name to save the encrypted file under: ";
    cin >> fileName;
    cout << endl;

    outFile.open(fileName, ios::out | ios::binary);
    outFile.write(str.c_str(), str.size());         // Writes the string to the binary file by first converting it to a C-String using the .c_str member function.

    system("pause");

return 0;
}

3 个答案:

答案 0 :(得分:2)

你听到的那些嘟嘟声是你文件中的字节等于0x07。你可以通过不在控制台中打印二进制文件的内容来摆脱这个问题。

答案 1 :(得分:2)

尝试自己做的赞誉。 问题是你没有仔细处理一些字符,例如白色空格可能会尝试打印出来

  

char d =(char)(7);

     

的printf( “%C \ n” 个,d);

被称为钟形角色。 这是一个简单的XOR加密实现,但我建议编写自己的版本

http://programmingconsole.blogspot.in/2013/10/xor-encryption-for-alphabets.html

答案 2 :(得分:1)

当你用一些随机密钥xor字节时,你会得到一些不寻常的字节序列。这些字节序列碰巧对应于一些不可打印的字符,您可以通过将它们发送到控制台来使控制台发出蜂鸣声。

如果删除该行

cout << str << endl;

你会发现你的控制台不再发出哔哔声,因为你没有打印出控制台正在解释的错误字节序列作为发出哔哔声的命令。

如果您的控制台设置为ASCII模式(我认为这是因为您有system("PAUSE")表示您在Windows上控制台不是Unicode,除非您明确地设置它IIRC)那么那些不可打印的字符是所有小于0x1F的字节和字节0x7F,以及导致控制台发出蜂鸣声的字符为0x7(称为“铃声”)。

TL;博士

加密数据中有一些0x7字节会导致控制台在打印时发出蜂鸣声。删除cout << str << endl;以修复它。