Шифрование вторым ключом и соответственно комбинированным работает некорректно исправь и опиши в чём была проблема:
package Visiner;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Visiner {

    private static int leastCommonMultiple(int first, int second) {
        return Math.abs(first * second) / greatestCommonDivisor(first, second);
    }

    private static int greatestCommonDivisor(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    private static List<Integer> extractShifts(String key, String alphabet) {
        List<Integer> shifts = new ArrayList<>();
        for (char character : key.toCharArray()) {
            char lowerChar = Character.toLowerCase(character);
            int position = alphabet.indexOf(lowerChar);
            if (position != -1) {
                shifts.add(position);
            }
        }
        return shifts;
    }

    private static String vigenereEncrypt(String inputText, List<Integer> keyShifts, int alphabetSize, String alphabet) {
        StringBuilder encrypted = new StringBuilder();
        int keyLength = keyShifts.size();

        for (int i = 0; i < inputText.length(); i++) {
            char currentChar = inputText.charAt(i);
            char lowerChar = Character.toLowerCase(currentChar);
            int index = alphabet.indexOf(lowerChar);

            if (index != -1) {
                boolean isUpperCase = Character.isUpperCase(currentChar);
                int shift = keyShifts.get(i % keyLength);
                int newIndex = (index + shift) % alphabetSize;
                char encryptedChar = alphabet.charAt(newIndex);
                encrypted.append(isUpperCase ? Character.toUpperCase(encryptedChar) : encryptedChar);
            } else {
                encrypted.append(currentChar);
            }
        }

        return encrypted.toString();
    }

    private static String vigenereDecrypt(String inputText, List<Integer> keyShifts, int alphabetSize, String alphabet) {
        StringBuilder decrypted = new StringBuilder();
        int keyLength = keyShifts.size();

        for (int i = 0; i < inputText.length(); i++) {
            char currentChar = inputText.charAt(i);
            char lowerChar = Character.toLowerCase(currentChar);
            int index = alphabet.indexOf(lowerChar);

            if (index != -1) {
                boolean isUpperCase = Character.isUpperCase(currentChar);
                int shift = keyShifts.get(i % keyLength);
                int originalIndex = (index - shift + alphabetSize) % alphabetSize;
                char decryptedChar = alphabet.charAt(originalIndex);
                decrypted.append(isUpperCase ? Character.toUpperCase(decryptedChar) : decryptedChar);
            } else {
                decrypted.append(currentChar);
            }
        }

        return decrypted.toString();
    }

    private static String combineKeys(List<Integer> key1Shifts, List<Integer> key2Shifts, int alphabetSize, String alphabet) {
        int combinedLength = leastCommonMultiple(key1Shifts.size(), key2Shifts.size());
        StringBuilder combinedKey = new StringBuilder();

        for (int i = 0; i < combinedLength; i++) {
            int shift1 = key1Shifts.get(i % key1Shifts.size());
            int shift2 = key2Shifts.get(i % key2Shifts.size());
            int totalShift = (shift1 + shift2) % alphabetSize;
            combinedKey.append(alphabet.charAt(totalShift));
        }

        return combinedKey.toString();
    }

    private static String readFile(String filePath, String fileDescription) {
        StringBuilder content = new StringBuilder();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                content.append(line).append("\n");
            }
        } catch (IOException e) {
            System.err.println("Ошибка: Не удалось прочитать " + fileDescription + " по пути: " + filePath);
            System.exit(1);
        }
        return content.toString().trim();
    }

    private static String chooseAlphabet(Scanner scanner) {
        System.out.println("Выберите алфавит для шифрования:");
        System.out.println("1. Русский");
        System.out.println("2. Английский");
        System.out.print("Ваш выбор (1 или 2): ");
        String choice = scanner.nextLine().trim();

        switch (choice) {
            case "1":
                return "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
            case "2":
                return "abcdefghijklmnopqrstuvwxyz";
            default:
                System.out.println("Некорректный выбор. Завершение программы.");
                System.exit(1);
                return null;
        }
    }

    private static String filterKey(String key, String alphabet) {
        StringBuilder filtered = new StringBuilder();
        for (char ch : key.toCharArray()) {
            if (alphabet.indexOf(Character.toLowerCase(ch)) != -1) {
                filtered.append(ch);
            }
        }
        return filtered.toString();
    }

    public static void main(String[] args) {
        Scanner inputScanner = new Scanner(System.in);

        String alphabet = chooseAlphabet(inputScanner);
        int alphabetLength = alphabet.length();

        System.out.print("Введите путь к текстовому файлу для шифрования: ");
        String textFilePath = inputScanner.nextLine().trim();
        String originalText = readFile(textFilePath, "исходного текста");

        System.out.print("Введите путь к файлу с первым ключом (K1): ");
        String key1Path = inputScanner.nextLine().trim();
        String key1 = readFile(key1Path, "первого ключа");

        System.out.print("Введите путь к файлу со вторым ключом (K2): ");
        String key2Path = inputScanner.nextLine().trim();
        String key2 = readFile(key2Path, "второго ключа");

        List<Integer> key1Shifts = extractShifts(key1, alphabet);
        List<Integer> key2Shifts = extractShifts(key2, alphabet);

        if (key1Shifts.isEmpty() || key2Shifts.isEmpty()) {
            System.err.println("Ошибка: Один из ключей не содержит допустимых символов.");
            System.exit(1);
        }

        String encryptedWithKey1 = vigenereEncrypt(originalText, key1Shifts, alphabetLength, alphabet);
        String encryptedWithKey2 = vigenereEncrypt(encryptedWithKey1, key2Shifts, alphabetLength, alphabet);

        String combinedKey = combineKeys(key1Shifts, key2Shifts, alphabetLength, alphabet);
        List<Integer> combinedShifts = extractShifts(combinedKey, alphabet);
        String encryptedCombined = vigenereEncrypt(originalText, combinedShifts, alphabetLength, alphabet);

        String filteredKey1 = filterKey(key1, alphabet);
        String filteredKey2 = filterKey(key2, alphabet);

        System.out.println("\n");
        System.out.println("Первый ключ:");
        System.out.println(filteredKey1);
        System.out.println("Текст после первого шифрования:");
        System.out.println(encryptedWithKey1);
        System.out.println("\n");
        System.out.println("Второй ключ:");
        System.out.println(filteredKey2);
        System.out.println("Текст после второго шифрования:");
        System.out.println(encryptedWithKey2);
        System.out.println("\n");
        System.out.println("Комбинированный ключ:");
        System.out.println(combinedKey);
        System.out.println("Текст после шифрования комбинированным ключом:");
        System.out.println(encryptedCombined);
        System.out.println("\n");

        try (BufferedWriter bw = new BufferedWriter(new FileWriter("encrypted_output.txt"))) {
            bw.write(encryptedCombined);
        } catch (IOException e) {
            System.err.println("Ошибка: Не удалось записать зашифрованный текст в файл.");
            System.exit(1);
        }

        try (BufferedWriter bw = new BufferedWriter(new FileWriter("combined_key.txt"))) {
            bw.write(combinedKey);
        } catch (IOException e) {
            System.err.println("Ошибка: Не удалось записать комбинированный ключ в файл.");
            System.exit(1);
        }

        System.out.println("Результаты успешно сохранены в 'encrypted_output.txt' и 'combined_key.txt'.");

        String decryptedText = vigenereDecrypt(encryptedCombined, combinedShifts, alphabetLength, alphabet);
        System.out.println("\nДешифрованный текст:");
        System.out.println(decryptedText);

        boolean isEncryptionConsistent = encryptedWithKey2.equals(encryptedCombined);
        boolean isDecryptionSuccessful = decryptedText.equals(originalText);

        if (isEncryptionConsistent) {
            System.out.println("\nПроверка: Зашифрованные тексты совпадают. Комбинированный ключ верен.");
        } else {
            System.out.println("\nПроверка: Зашифрованные тексты НЕ совпадают. Проверьте реализацию.");
        }

        if (isDecryptionSuccessful) {
            System.out.println("Проверка: Дешифрование прошло успешно. Исходный текст восстановлен.");
        } else {
            System.out.println("Проверка: Дешифрование НЕ удалось. Проверьте реализацию.");
        }

        inputScanner.close();
    }
}