2017-01-22 10 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 

С помощью этой небольшой программы Java:

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\ 

Как можно видеть, я могу читать Time New Roman, но также í, где это не должно быть, и я не могу понять, почему, как будто сдвиги будут неправильными, чем весь текст должен быть неправильным не только его частью. Также зашифрованный текст может быть дешифрован правильно. Если у вас есть какие-либо идеи, подсказка будет с радостью оценена.

+0

239 не кажется правильным сдвигом, потому что 'd' имеет ascii-код 100, и если мы добавим 239 или вычтем его, мы будем находиться за пределами префикса таблицы ascii 256 символов. –

+0

@AlexanderV. он не должен выходить за пределы ascii, так как я положил 'ascii = ascii% 256;' поэтому он вернется обратно к пределу 256 –

ответ

2

Вы делаете простую ошибку: путают двоичные/байты с символьными строками.

Существует не такая вещь, как «256 ASCII», ASCII имеет 7 бит, то есть кодируется в пределах [0..127], а первое 32 и последнее значение - управляющий символ.

Что вы говорите, это байт, и операции над ними должны выполняться. Если вы выполните вычисление по байту в Java, оно будет автоматически находиться в диапазоне 0..255. Вы должны быть осторожны, хотя байт не «продвигается» до целого числа, отбрасывая с помощью (byte) время от времени.

Так что, за исключением окончательной распечатки, все операции должны быть в байтах. Использование Reader и Writer уже может потерять данные, поскольку некоторые символы могут быть опущены. Просто используйте потоки напрямую, а затем просмотрите вывод в любом текстовом редакторе.

Вы также можете использовать тот факт, что выходной сигнал находится между определенными байтовыми значениями (допустимые кодировки символов), чтобы проверить правильность вашего решения.


Обратите внимание, что мы не можем проверить для вас, поскольку ваш ввод «строка», скорее всего, уже искалечен. Кодируйте его, используя base 64 или hexadecimals, если вы хотите распечатать его здесь.

+0

Спасибо! Я не знаю, как я мог совершить такую ​​ошибку. Я сделал именно то, что вы мне сказали, используйте «Files.readAllBytes (path_to_file)»; читать байты, преобразовывать их в беззнаковый, а затем в целые числа. –