0

Javaを使用してストリーム暗号を作成しようとしています。ファイルからプレーンテキストを取得して暗号化し(シード値を持つランダムキーを使用した単純なXOR)、別のファイルに保存してから復号化し、再び暗号テキストを取得しますファイルから復号化し(暗号化と同じキーを使用した XOR 操作)、ファイルに保存します。

しかし、大きな文字列を暗号化しようとしたときに問題に直面しています。文字列の半分は正しく復号化されていますが、残りの半分は判読できない形式のままです。

                FileReader fileReader = new FileReader(file);

                // Always wrap FileReader in BufferedReader.
                BufferedReader bufferedReader = 
                    new BufferedReader(fileReader);

                FileWriter fileWriter =
                        new FileWriter(file2);

                    // Always wrap FileWriter in BufferedWriter.
                    BufferedWriter bufferedWriter =
                        new BufferedWriter(fileWriter);


                while((line = bufferedReader.readLine()) != null) {
                    sb = new StringBuffer (line);

                    int lenStr = line.length();
                    int lenKey = String.valueOf(random).length();

                    // For each character in our string, encrypt it...
                    for ( int i = 0, j = 0; i < lenStr; i++, j++ ) 
                    {
                       if ( j >= lenKey ) j = 0;  // Wrap 'round to beginning of key string.

                       //
                       // XOR the chars together. Must cast back to char to avoid compile error. 
                       //
                       String key = random + "";
                       bufferedWriter.write((char)(line.charAt(i) ^ key.charAt(j)));

                    }
                }   

                // Always close files.
                bufferedReader.close();  
                bufferedWriter.close();
4

1 に答える 1

0

十分な注意を払わずに、バイナリと文字と文字列を混在させています。文字の XOR は、文字列を表していない文字になる可能性があります。2 つの同一の文字が XOR された場合、結果はヌル文字になり、通常は END of FILE として解釈されます。

代わりに、XOR を実行するときはすべてをバイナリにしておくのが最善です。XOR はバイナリ演算であり、文字に対する演算ではありません。したがって、代わりにバイト配列を使用します。

于 2016-02-27T00:06:42.890 に答える