0

任意のテキスト ファイルを開き、それを文字列に読み取り、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;
}
4

3 に答える 3

2

聞こえたビープ音は、ファイル内の0x07に等しいバイトです。コンソールにバイナリファイルの内容を出力しないだけで、この問題を取り除くことができます。

于 2012-05-28T07:18:47.603 に答える
2

自分でやろうとしていることに敬意を表します。問題は、一部の文字を慎重に処理していないことです。たとえば、空白が印刷されようとする場合があります

char d=(char)(7);

printf("%c\n",d);

ベル文字と呼ばれるものです。これは XOR 暗号化の簡単な実装ですが、独自のバージョンを作成することをお勧めします

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

于 2013-11-29T13:58:04.850 に答える
1

ランダムなキーでバイトを xor すると、異常なバイト シーケンスが得られます。これらのバイト シーケンスは、コンソールに送信することでコンソールのビープ音を鳴らすために使用できる印刷できない文字に対応しています。

ラインを外すと

cout << str << endl;

コンソールがビープ音を鳴らすコマンドとして解釈している誤ったバイトシーケンスを出力していないため、コンソールはビープ音を鳴らしなくなります。

コンソールがASCIIモードに設定されている場合(system("PAUSE")IIRCを明示的に設定しない限り、コンソールがUnicodeではないWindowsを使用していることを示しているためだと思います)、これらの印刷できない文字はすべて0x1F未満のバイトであり、 0x7F であり、コンソールのビープ音の原因となる文字は 0x7 (「ベル」と呼ばれます) です。

tl;dr

暗号化されたデータに 0x7 バイトが含まれているため、印刷時にコンソールがビープ音を鳴らします。cout << str << endl;それを修正するために削除します。

于 2012-05-28T07:15:06.350 に答える