Advertisement
teaowl

Method Kasiski

Apr 5th, 2022
1,242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.85 KB | None | 0 0
  1. package test;
  2.  
  3. import java.io.FileReader;
  4. import java.io.IOException;
  5. import java.util.HashMap;
  6.  
  7. public class test2 {
  8.  
  9.     public static void main(String[] args) throws IOException {
  10.         HashMap<String, Integer> l = new HashMap<>(); // расстояния между повторами
  11.         int nods[] = new int[500]; // НОД
  12.         String text = "";   //текст
  13.        
  14.         FileReader fr = new FileReader("text/out.txt");//out.txt
  15.         char[] charArray = new char[500];
  16.         fr.read(charArray);
  17.         fr.close();
  18.         text = new String(charArray);
  19.        
  20.          // переменные-подстроки для сравнения
  21.         String sub1, sub2;
  22.         char[] s1, s2;
  23.         s1 = new char[3];
  24.         s2 = new char[3];
  25.        
  26.         //ищем расстояния
  27.         for(int i = 0; i < text.length()-2; i++) {
  28.             //получаем подстроку 1
  29.             sub1 = text.substring(i, i+3);
  30.             for(int j = i + 1; j < text.length()-2; j++) {
  31.                 //получаем подстроку 2
  32.                 sub2 = text.substring(j, j+3);
  33.                 System.out.printf("[%d/%d] [%s] vs [%s]\n", i+i*j, (int)Math.pow(text.length(), 2), sub1,sub2);
  34.                 //сравниваем
  35.                 if(sub1.equals(sub2)) {
  36.                     l.put(sub1, j-i);// равны? пишем расстояние между 1 и 2 в массив
  37.                 }
  38.             }
  39.         }
  40.    
  41.         //вычисляем НОД между всеми комбинациями расстояний и пишем в таблицу
  42.         for(var i : l.values()) {
  43.             for(var j: l.values()) {                 
  44.                 nods[nod(i, j)]++;
  45.             }
  46.         }
  47.        
  48.         // Ищем какой из НОД самый часто встречающийся
  49.         int keylen = 0;
  50.         for (int i = 2; i < 500; i++)
  51.             if (nods[keylen] < nods[i]) keylen = i;
  52.            
  53.         System.out.println("Keylen: "+keylen);
  54.     }
  55.    
  56.     static int nod(int a, int b) {
  57.         for(int i = a; i > 1; --i)
  58.             if((a % i == 0) && (b % i == 0))
  59.                 return i;
  60.         return 1;
  61.     }
  62.  
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement