2017-01-22 1 views
0

카이사르 인코딩 된 기본 256 ASCII 텍스트를 무차별 공격으로 해독하려고합니다. 문제의 텍스트는 다음과 같습니다이 작은 자바 프로그램을카이사르 암호화 된 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'는 ASCII 코드 100을 가지고 있기 때문에 올바른 이동으로 보이지 않습니다. 239를 추가하거나 빼면 우리는 256 자 ASCII 테이블 제한을 벗어납니다. –

+0

@AlexanderV. 그것은 내가 ascii 한도를 벗어나 야한다. 'ascii = ascii % 256;' 그래서 그것은 256 한계로 돌아갑니다 –

답변

2

바이너리/바이트를 문자열과 혼동하는 것은 아주 기본적인 실수입니다.

"256 ASCII"와 같은 것은 없으며 ASCII는 [0..127] 내에 인코딩되며 첫 번째 32와 마지막 값은 제어 문자입니다.

당신이 말하는 것은 바이트이며 그 작업을 수행해야합니다. Java에서 바이트에 대한 계산을 수행하면 자동으로 0..255 범위 내에있게됩니다. 바이트가 정수로 "승격"되지 않고 나중에 (byte)을 사용하여 캐스트하면주의해야합니다.

최종 출력을 제외하고 작업은 모두 바이트로 이루어져야합니다. ReaderWriter을 사용하면 일부 문자가 빠질 수 있으므로 이미 데이터가 손실 될 수 있습니다. 스트림을 직접 사용하고 텍스트 판독기에서 출력을 봅니다.

물론 출력이 특정 바이트 값 (유효한 문자 인코딩) 사이에 있다는 사실을 사용하여 솔루션이 올바른지 테스트 할 수도 있습니다.


입력 한 "문자열"이 이미 불구가 될 가능성이 있으므로 테스트 할 수 없습니다. 여기에 인쇄하려면 기본 64 또는 16 진수를 사용하여 인코딩하십시오.

+0

고마워요! 어떻게 그런 실수를 할 수 있었는지 나는 모른다. 나는 네가 나에게 말한대로 정확하게 'Files.readAllBytes (path_to_file);'를 사용했다. 바이트를 읽고, 부호없는 부호로 변환 한 후 정수로 변환합니다. –