2017-01-22 32 views
0

私はシーザーエンコードされた256文字のASCIIテキストをブルートフォースで解読しようとしています。 問題のテキストは次のとおりです。この小さなJavaプログラムでシーザーで暗号化されたASCIIテキストが部分的に復号化されました

dy}uƒ0^u‡0b}q~K‹lvAlv‚}q~lv€‚Blvsxq‚ƒu„B0c‰}r|K‹lvBlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0Q‚yq|K‹lvClv‚}q~lv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cu‚yv‹l:lvq|„0dy}uƒ0^u‡0b}q~K‹lvDlvƒ‡yƒƒlv€‚Blvsxq‚ƒu„@0\yru‚q„y~0cq~ƒ‹l:lvq|„0Q‚yq|K‹lvElv‚}q~lv€‚@lvsxq‚ƒu„ABH0dy}uƒ0^u‡0b}q~K‹lvFlv~y|l 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 

public class Run { 
    private static FileWriter fr; 
    static String b; 
    private static BufferedReader br; 

    public static void main(String[] args) throws IOException { 

     // encrypted file 
     File enc_f = new File("caesar.rtf.enc"); 
     //decrypted file 
     File dec_f = new File("caesar.rtf.dec"); 

     // init variables 
     String text_enc = new String(); 
     String text_dec = new String(); 

     // read file 
     br = new BufferedReader(new FileReader(enc_f)); 
     for (String line; (line = br.readLine()) != null; text_enc += line); 
     char[] stringToCharArray = text_enc.toCharArray(); 

     // parse file and convert string to char 
     for (int shift = 0; shift < 257; shift++) { 

      for (char output : stringToCharArray) { 

       // convert ascii to int 
       int ascii = (int) output; 

       // shift 
       ascii = ascii + shift; 
       ascii = ascii % 256; 

       // convert back to ascii 
       char chTemp = (char) ascii; 
       text_dec += chTemp; 

      } 

      // visual representation 
      text_dec += System.lineSeparator(); 
      text_dec += System.lineSeparator(); 
      text_dec += shift; 
      text_dec += System.lineSeparator(); 
      System.out.println(shift); 

      // write decrypted file 
      fr = new FileWriter(dec_f); 
      fr.write(text_dec); 

     } 
     fr.close(); 
    } 
} 

全体のほんの一部である私は(シフト数239部分復号化されたテキストを取得するプログラムを実行した後)小さな実行時間を維持するためのファイル:

Timeí Neí Roman;íí\f1\fíoman\fííí2\fchaííeí2 Símbol;íí\f2\fííiíí\fííí2\fchaííeí0 Aíial;íí\f3\fíoman\fííí2\fchaííeí0 Libeíaíion Seíifí\*\falí Timeí Neí Romaní;íí\f4\fííiíí\fííí2\fchaííeí0 Libeíaíion Saníí\*\falí Aíialí;íí\f5\fíoman\fííí0\fchaííeí128 Timeí Neí Roman;íí\f6\fnil\ 

私は時間の新しいローマを読むだけでなく、できる見ることができるように10それはそうではないと私は理由が理解できない場合は、すべてのテキストが間違っている必要がありますシフトは正しかったかのようにそれの一部だけではありません。また、暗号化されたテキストを正しく復号化することができます。 あなたは何か考えがあるなら、ヒントは喜んで評価されるでしょう。

+0

239は 'd'にはアスキーコード100があり、239を追加するか減算すると256文字のアスキーテーブルの範囲外になるため、正しいシフトではないようです。 –

+0

@AlexanderV。それはasciiの限界の外に行くべきではありません。 'ascii = ascii%256;'それは256の限界に戻すでしょう –

答えて

2

あなたは非常に基本的な間違いを犯しています。バイナリ/バイトを文字列と混同することです。

ASCIIは7ビットであり、すなわち[0..127]内にエンコードされ、最初の32は最後の値がの制御文字です。

あなたが話しているのはバイトであり、これらの操作を実行する必要があります。 Javaのバイトに対して計算を実行すると、自動的に0..255の範囲内になります。バイトが整数に "昇進"されていないのに、今度は(byte)を使ってキャストバックしても、注意する必要があります。

最終的なプリントアウトを除いて、操作はすべてバイトである必要があります。 ReaderWriterを使用すると、一部の文字が欠落する可能性があるため、データが失われる可能性があります。ストリームを直接使用して、任意のテキストリーダーで出力を表示してください。

もちろん、ソリューションが正しいかどうかをテストするために、出力が特定のバイト値(有効な文字エンコーディング)の間にあるという事実を利用することもできます。


あなたの入力「文字列」がすでに損害を受けている可能性があるため、テストできないことに注意してください。ここに印刷する場合は、ベース64または16進数でエンコードします。

+0

ありがとう!私はそのような間違いをどうやって作りましたか分かりません。私はあなたが私に言ったことを正確に行い、 'Files.readAllBytes(path_to_file);'バイトを読み込み、符号なしのものに変換してから整数に変換します。 –

関連する問題