2015-02-20 1 views
0

Я пытаюсь в java написать программу, которая будет кодировать строку, такую ​​как шифр vigenere. Пример запуск будетПопытка написать код Java Vigenere Cipher с пользовательским вводом

java Encrypt -e lemon <in.txt> out.txt 

in.txt следует читать ATTACKATDAWN и out.txt следует читать LXFOPVEFRNHR, и если используются недостаточно # из аргументов он должен распечатать заявление об использовании; Однако, когда я запускаю метод шифрования на этом, он возвращает «?? ???? ????»?, И если я запустил метод дешифрования на THAT, он возвращает «??? ???? ??? ?», и если я кладу меньше, чем требуется два аргумента, она возвращает

исключение в потоке„главный“java.lang.ArrayIndexOutOfBoundsException: 1 в Encrypt.main (Encrypt.java:22)

вот мой код

import java.util.Scanner; 

public class Encrypt 
{ 

public static void main(String[] args) 
{ 
    Scanner scan = new Scanner (System.in); 
    String msg = scan.nextLine(); 
    String key = args[1]; 

    if (args.length < 2) 
    { 
     System.out.println("Encryption program by ----"); 
     System.out.println("Usage: java Encrypt [-e, -d] <inputFile> outputFile"); 
     System.exit(0); 
    } 

    else if (args[0].equals ("-e")) 
    { 
     String emsg = encrypt(args[1], msg); 
     System.out.println(emsg); 
    } 
    else if (args[0].equals ("-d")) 
    { 
     String dmsg = decrypt(args[1], msg); 
     System.out.println(dmsg); 
    } 

} 

public static void usage(String[] args) 
{ 
    if (args.length < 2) 
    { 
     System.out.println("Encryption program by --------"); 
     System.out.println("Usage: java Encrypt [-e, -d] <inputFile> outputFile"); 
     System.exit(0); 
    } 
} 

public static String encrypt(String key, String msg) 
{ 
    String emsg = ""; 
    for (int i = 0; i < msg.length(); i++) 
    { 
     int m = msg.charAt(i); 
     int k = key.charAt(i % key.length()); 
     int e = (m + (k - 32)); 
     char s = (char) e; 
     if (e > 126) 
      e = (e - (127 - 32)); 
     emsg += s; 
    } 
return emsg; 
} 
public static String decrypt(String key, String msg) 
{ 
    String dmsg = ""; 
    for (int i = 0; i < msg.length(); i++) 
    { 
     int m = msg.charAt(i); 
     int k = key.charAt(i%key.length()); 
     int e = (m - (k - 32)); 
     char s = (char) e; 
     if (e > 126) 
      e = (e - (127 - 32)); 
     dmsg += s; 
    } 
return dmsg; 
} 
} 

Я честно не знаю, что я делаю неправильно; ЛЮБАЯ помощь была бы очень желанной!

ответ

0

Вы получаете ArrayIndexOutOfBoundsException, потому что доступ ко второму элементу массива:

String key = args[1]; 

, прежде чем вы протестировали длину args. Избавиться от этой линии полностью, так как вы не ссылаетесь на key где-либо еще в своем приложении. (Хорошая IDE должна была сказать вам это уже).


Для вашего зашифрованного кода, я думаю, вы найдете это довольно сложно, если не ограничивать себя только прописные (или строчные) буквы. Предполагая, что вы идете на верхний регистр, вычитая 65 из значения ASCII, вы получите удобную работу с 0-25 с помощью. Затем вы можете использовать дополнение, modulo-26 для достижения своей цели.

Я исправил свое шифрование, теперь попробуйте сделать расшифровку:

public static String encrypt(String key, String msg) { 
    String emsg = ""; 
    final int offset = 'A'; // 65 
    for (int i = 0; i < msg.length(); i++) { 
    int m = msg.charAt(i) - offset; 
    int k = key.charAt(i % key.length()) - offset; 
    int e = (m + k) % 26; 
    char s = (char) (e + offset); 
    emsg += s; 
    } 
    return emsg; 
}