Расшифровка шифра Виженера на Java

Я пытаюсь расшифровать шифрование с помощью метода java, однако мой код, похоже, не возвращается правильно. Я попытался отменить процесс шифрования, но я не вижу, что я делаю неправильно. Извините, я надеюсь, что это не глупый вопрос.

public void decrypt()
{
    String cipherText = this.message;
    String key = this.KEY;
    String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    int alphabetSize = alphabet.length();
    int textSize = cipherText.length();
    int keySize = key.length();
    StringBuilder decryptedText = new StringBuilder(textSize);

    for (int i = 0; i < textSize; i++)
    {
        char encyrptChar = cipherText.charAt(i); // get the current character to be shifted
        char keyChar = key.charAt(i % keySize); // use key again if the end is reached
        int plainPos = alphabet.indexOf(encyrptChar); // plain character's position in alphabet string
         // decrypt the input text
        int keyPos = alphabet.indexOf(keyChar); // key character's position in alphabet
        int shiftedPos = plainPos-keyPos;
        shiftedPos += alphabetSize;
        decryptedText.append(alphabet.charAt(shiftedPos));
    }

    this.message =  decryptedText.toString();
}

person Bradley    schedule 15.11.2012    source источник
comment
Какова логика кода и что вы хотите сделать?   -  person Bhavik Ambani    schedule 15.11.2012
comment
Я уже видел тот же вопрос вчера ... кажется, что крайний срок домашней работы близок;)   -  person das_weezul    schedule 15.11.2012
comment
Если это от Coursera, такие вопросы следует закрыть и удалить: coursera.org/about/honorcode   -  person Tomasz Nurkiewicz    schedule 15.11.2012
comment
@das_weezul Я видел один, который работает по сети и игнорирует непечатаемые символы. Излишне говорить, что они оба были виженерами, но все же взаимно несовместимыми.   -  person John Dvorak    schedule 15.11.2012
comment
Я не учусь на курсах Coursera. пожалуйста, не обвиняйте меня в этом.   -  person Bradley    schedule 15.11.2012
comment
Возможно, это та же проблема, что и здесь: массив с использованием шифра Виженера в java"> stackoverflow.com/questions/13386266/   -  person John Dvorak    schedule 15.11.2012
comment
Что должно происходить с символами, не являющимися строчными буквами? Этот будет кодировать их как z.   -  person John Dvorak    schedule 15.11.2012
comment
@JanDvorak: Это вопрос, который я прочитал вчера   -  person das_weezul    schedule 15.11.2012
comment
Я полагаю, что пытаюсь проиндексировать все символы нижнего регистра az с числом, а затем вычислить индекс основного ключа и расшифрованных текстовых чисел, из которых я пытаюсь расшифровать каждый символ и добавить его в построитель строк.   -  person Bradley    schedule 15.11.2012
comment
Можете ли вы опубликовать пример ввода / вывода?   -  person PearsonArtPhoto    schedule 16.11.2012


Ответы (2)


shiftedPos += alphabetSize;

Почему вы делаете это? Я думаю, вы должны сделать это, только если shiftedPos‹0.

if(shiftedPos<0)
   shiftedPos += alphabetSize;

Это потому, что если a=0 и b=1, (a-b)=-1 означает z. Чтобы работать со всем набором ASCII, вам просто нужно заменить строку alpabeth и размер всеми символами ASCII в правильном порядке.

person Daniela Mogini    schedule 15.11.2012

Взял эти строки:

    char encyrptChar = cipherText.charAt(i); // get the current character to be shifted
    char keyChar = key.charAt(i % keySize); // use key again if the end is reached
    int plainPos = alphabet.indexOf(encyrptChar); // plain character's position in alphabet string

    int keyPos = alphabet.indexOf(keyChar); // key character's position in alphabet
            int shiftedPos = plainPos-keyPos;
            shiftedPos += alphabetSize;

Есть несколько вопросов.

  1. plainPos на самом деле является зашифрованным значением, не путайте их.
  2. plainPos-keyPos должно быть равно расшифрованному значению. Затем вы должны изменить это на alphabetSize, чтобы получить правильное значение.

Будьте осторожны при работе с соглашением об именах. Это действительно может вызвать некоторые проблемы...

Кроме того, я думаю, что ваш код действительно работает правильно. Я, конечно, не вижу никаких проблем. Попробуйте воспользоваться онлайн-шифровальщиком/расшифрователем.

person PearsonArtPhoto    schedule 15.11.2012