1

私はrc4の実装を書こうとしています。ifstream を使用してファイルから平文を読み込んでいます。ファイルの最後に出力されていないことに気付いたので、バッファを明示的にクリアするさまざまな方法を試しました。どちらの方法でも (endl を使用し、\n を追加し、cout.flush() を呼び出して) バッファをフラッシュしようとすると、segfault が発生します。健全性チェックとして、コードを Web の例に置き換え、これも個別にテストしました。独自のファイルに入れてコンパイルすると機能します(たとえば、ファイルの内容を出力し、segfault を実行せず、flush() または endl を呼び出す必要はありません)が、機能しません。私のコードで。

問題のあるコードは次のとおりです (これは私のコードの外でも問題なく動作します。cplusplus.com からほとんど直接コピーされています)。

 ifstream is;
 is.open("plain");
 char c;
 while (is.good())     // loop while extraction from file is possible
 {
     c = is.get();       // get character from file
     if (is.good())
         cout << c;
//       cout.flush();
 }
 is.close();           // close file*/

完全なコードは次のとおりです: (警告、コメントアウトされたコードがたくさんあります)

#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>

using namespace std;
static char s[256], k[256];
//static char *i, *j;
void swap(int m, int n, char t[256]){
        char tmp = t[m];
        t[m] = t[n];
        t[n] = tmp;
}

char getByte(){
        static char i(0), j(0);
        i = (i+1)%256;
        j = (j + s[i])%256;
        swap(i, j, s);
        return s[(s[i]+s[j]) % 256];
}

int main(int argc, char ** argv){
        /*string key = argv[1];*/
        if(argc < 4){
                cout << "Usage: \n rc4 keyfile plaintextfile outputfile" << endl;
                return -1;
        }
        string key;
        ifstream keyfile (argv[1]);
        keyfile >> k;
        cout << "Key = " << k << endl;
        keyfile.close();
        /*ifstream plaintextf;
        plaintextf.open(argv[2]);*/

        ofstream ciphertextf (argv[3]);

        for(int q = 0; q < 256; q++){
                s[q] = q;
        }
        int i, j;
        for(int m = 0; m < 256; m++){
                j = (j + s[m] + k[m % sizeof(k)])%256;
                swap(m, j, s);
        }
//      vector<char> bytes(plaintext.begin(), plaintext.end());
//      bytes.push_back('\0');
//      vector<char>::iterator it = bytes.begin();
/*      char pt;
        while(plaintextf.good()){
                pt = plaintextf.get();
                if(plaintextf.good()){
                        cout << pt;

                      ciphertextf <<(char) (pt ^ getByte());
                }

        } */
        ifstream is;
        is.open("plain");
        char c;
         while (is.good())     // loop while extraction from file is possible
         {
            c = is.get();       // get character from file
            if (is.good())
              cout << c;
//              cout.flush();
         }
  is.close();           // close file*/

/*//    plaintextf.close();
        ciphertextf.close();
        keyfile.close();
        */
        return 0;
}
4

1 に答える 1

0

さらに、[ if(is.good()) のように] is.good() への2回目の呼び出しは、ファイルの最後の文字がコピーされるのを防ぐと思います。

于 2012-04-10T01:23:31.550 に答える