Нужна помощь в устранении неполадок моего Java-кода VigenereCipher

Итак, я создал этот код в прошлом году для проекта класса, и я помню, что он работал правильно. Теперь мне нужно реализовать текстовый шифр, но по какой-то причине он работает неправильно. Он будет зашифрован, но когда я пытаюсь расшифровать, только первые две буквы верны. В остальном все неправильно. Это очень просто, это программа командной строки, в которой первый аргумент - шифрование (-e) или дешифрование (-d), второй аргумент - ключ, а третий аргумент - текст, который вы зашифруете. Это похоже на шифр Цезаря, за исключением того, что он принимает каждый символ в качестве ссылки при добавлении к каждому отдельному символу в строке. Может кто-нибудь сказать мне, что не так, я не понимаю, почему это больше не работает, и мне это нужно для проекта.

import java.util.*;

public class VigenereCipher 
{
    public static void main(String[] args) 
    {
        Scanner scan = new Scanner (System.in);
        String key = "";
        String ori = "";

        String res = "";

        if(!(args.length == 0)) 
        {
            if (args[0].equals("-e"))
            {
                key = args[1];
                ori = args[2];
                encrypt(ori, key);
                System.out.println(encrypt(ori, key));

            }
            else if (args[0].equals("-d"))
            {
                key = args[1];
                ori = args[2];
                decrypt(ori, key);
                System.out.println(decrypt(ori, key));

            }
           else
           {
            System.out.print("Usage: java VigenereCipher [-e,-d] key text");
           }


        }


    }



    static String encrypt(String text, final String key) 
    {
        String res = "";
        text = text.toUpperCase();
        for (int i = 0, j = 0; i < text.length(); i++) 
        {
            char c = text.charAt(i);
            if (c < 'A' ||  c > 'Z') continue;
            res += (char)((c + key.charAt(j) - 2 * 'A') % 26 + 'A');
            j = ++j % key.length();
        }
        return res;
    }

    static String decrypt(String text, final String key)
      {
        String res = "";
        text = text.toUpperCase();
        for (int i = 0, j = 0; i < text.length(); i++)
        {
            char c = text.charAt(i);
            if (c < 'A' || c > 'Z') continue;
            res += (char) ((c - key.charAt(j) + 26) % 26 + 'A');
            j = ++j % key.length();
        }
        return res;
    }
}

Предполагается, что вы сможете зашифровать строку текста ключом, а затем расшифровать результат шифрования, используя тот же ключ, например: java VigenereCipher -e hello hello даст мне "UOCCI" в качестве вывода, но когда я беру этот вывод и делаю java VigenereCipher -d hello UOCCI это дает мне "HE225" как мой вывод, а не "HELLO".

1 ответ

Решение

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

Это станет совершенно ясно, когда вы разделите свой алгоритм на части, например, я только что прошел:

int im = c + key.charAt(j) - 2 * 'A';
res += (char)(im % 26 + 'A');

с моим отладчиком и presto проблема обнаружилась.

Другие вопросы по тегам