Skip to content

CryptoAnalyzerPantera#42

Open
Phoenix190696 wants to merge 6 commits intodemologin:mainfrom
Phoenix190696:main
Open

CryptoAnalyzerPantera#42
Phoenix190696 wants to merge 6 commits intodemologin:mainfrom
Phoenix190696:main

Conversation

@Phoenix190696
Copy link

No description provided.

Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Generated Review


// Размер алфавита (количество символов в массиве chars)
public static final int size = chars.length;

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Используйте Stream API для инициализации карты: IntStream.range(0, chars.length).boxed().collect(Collectors.toMap(i -> chars[i], i -> i)). Статические блоки инициализации — это устаревший императивный стиль.

*/
public int showMenu() {
System.out.println("""
Выберите режим работы(введите цифру):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Используйте текстовые блоки (Text Blocks) Java 15+ для меню, но дополните их методом formatted() или Pattern Matching для switch (Java 21). Это сделает код более декларативным.


/**
* Выполняет выбранный пользователем режим работы.
*
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В Java 21 switch может возвращать значение и поддерживать проверку типов. Рекомендуется переписать логику на switch expression, чтобы избежать дублирования кода scanner.nextLine() и сделать структуру более компактной.

}

int read; // Переменная для хранения считанного символа (в виде int)
while ((read = reader.read()) != -1) { // Читаем файл посимвольно, пока не достигнем конца (-1)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для циклического сдвига индекса в Java лучше использовать Math.floorMod(index - key, Alphabet.size). Это заменяет ручную проверку if (newIndex < 0) и делает код математически чище.

}

String stringfile = reader.readLine(); // Читаем первую строку файла
String[] strarray = stringfile.split(" "); // Разбиваем строку на массив слов по пробелам
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ошибка логики: вызов new FileNotFoundException(); просто создает объект исключения, но не выбрасывает его. Необходимо использовать ключевое слово throw.

/** Ключ для шифрования/дешифрования. */
int key;

/**
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поля source, destination, key не должны быть полями класса Main. Это состояние должно передаваться через параметры методов, чтобы обеспечить потокобезопасность и чистоту кода.

private static int findBestKey(Map<Character, Double> representativeFreq, Map<Character, Double> encryptedFreq) {
int bestKey = 0; // Лучший ключ
double minError = Double.MAX_VALUE; // Минимальная ошибка (начальное значение — максимум)

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для вычисления error (суммы квадратов разностей) идеально подходит Stream API: Arrays.stream(Alphabet.chars).mapToDouble(...).sum(). Это делает алгоритм более читаемым.

* @throws FileNotFoundException если файл-источник отсутствует
*/
public static void searchKey(String source, String dest){ // Метод для перебора ключей и попытки взлома
try(BufferedReader reader = new BufferedReader(new FileReader(source))){ // Открываем исходный файл для чтения
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Статическая переменная key используется для хранения промежуточного состояния. Это делает метод нереентерабельным и опасным при многопоточном выполнении. Используйте локальную переменную.

System.out.println("Расшифровка завершена"); // Сообщаем пользователю, что процесс завершён
} catch (FileNotFoundException e) { // Обработка ошибки: файл не найден
System.out.println("Ошибка: файл не найден");
} catch (IllegalArgumentException e) { // Обработка ошибки: недопустимый ключ
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Пустой блок catch (Exception e) {} — это антипаттерн 'Swallowed Exception'. Как минимум, добавьте логирование ошибки, иначе отладка станет невозможной.

int total = 0; // Общее количество символов

try(BufferedReader reader = new BufferedReader(new FileReader(source))){ // Открываем файл для чтения
if(!Files.exists(Path.of(source))){ // Проверяем, существует ли файл
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Использование Files.exists вместе с new FileReader избыточно. Современный подход Java 21 — использовать Files.newBufferedReader(Path) и обрабатывать исключения напрямую.

Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Поставил оценку C. Сроки повлияли

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants