2015-10-10 2 views
0

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

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».

+0

Каков ожидаемый выход/поведение? Каков фактический результат/поведение? – hexafraction

+0

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

+0

Поведение Java не сильно меняется в этом отношении, если вы не говорите о действительно старых или ненормальных версиях. – hexafraction

ответ

0

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

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

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

с моим отладчиком и престо, проблема возникла.

+0

Wow thanks. Мне как-то пришлось снова взглянуть, чтобы понять, что вы имели в виду, так как я думал, что для установки всех символов в верхний регистр я бы не столкнулся с проблемой, но теперь вижу. – Dayman

Смежные вопросы