0

このように機能するXORベースのen/decryptorを作成しています。たとえば3の平文文字と、たとえば5のユーザーキーがあります。ビット単位で記述:

3 = 00000011

5 = 00000101

XOR演算を実行すると、6が得られます。

6 = 00000110

これは、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;
}

プログラムがテキストを正しく翻訳しないのはなぜですか?そして、なぜそれはファイルの終わりに文字を追加するのですか?

4

4 に答える 4

7

見た目からすると、暗号化はここではほとんど何の関係もありません(または少なくとも問題とは関係ありません)。

while(!fin.eof() && znak != ' ')

フォームのループは、while (!whatever.eof())正しく機能しないことがほぼ保証されています。

    fin.get(buffer, sizeof(buffer)); 

これを行うときは、文字を読み取ることを保証するものではなく、それ以上は読み取らないことに注意してください。読み取る文字がそれほど多くない場合は、通常、ファイルの最後で取得する文字数が少なくなります。[編集:他の場所でも読み取ることができる数が少ないことにも言及する必要があります。たとえば、ネットワーク接続から読み取る場合、部分的なバッファーを受け取ることはかなり一般的ですが、到着したときにもっと遅くなります。]sizeof(buffer)

for(int i = 0; i < sizeof(buffer); i++)

したがって、ここで文字を処理しようとする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;
}
于 2011-02-22T20:43:04.850 に答える
1

私が気付いたいくつかの項目は次のとおりです。1 。データ型を使用
してバイナリで操作します。 または、暗号化スキームに大混乱をもたらす可能性があります。 ファイルをとして開き、OSがバイトを変換しないようにします。unsigned char
charsigned char
binary

年:

char buffer[5001]; 
ifstream fin("a.txt", ifstream::in);
ofstream fout("b.txt");

修正:

const unsigned int BUFFER_SIZE = 4096; // Prefer multiples of 2.
ifstream fin("a.txt", ios::binary);  // ifstream::in is redundant for an ifstream
ofstream fout("b.txt", ios::binary);

データ型と一致している。とタイプ
は異なるサイズである可能性がありますバイトで遊びたい場合はお勧めします。 intcharunsigned char

参照:intキー; char znak;

I/Oステートメントをステートメントの式として使用しwhileます。要するに、eof読んだ後に引き起こされます:

while ((fin >> znak) && (znak != ' '))
于 2011-02-22T20:46:51.867 に答える
1

私はあなたを助けるかもしれないいくつかのXOR暗号化コードをオンラインで見つけました

これは、 chttps://code.google.com/p/xorencryption/で美しく記述されたコードです 。

C++で書かれています http://programmingconsole.blogspot.in/2013/10/xor-encryption-for-alphabets.html

于 2013-11-22T13:33:32.693 に答える
0

ファイルをバッファに読み込むコードを注意深く見てください。get()関数は、最大で要求された文字数を読み取ります。ファイルの終わりでは少なくなります。gcount()で実際に読み取られた数を確認し、暗号化手順を実行するときにそれらのみをループする必要があります。

他にも必要な片付けが少しあるようです。

于 2011-02-22T20:39:43.133 に答える