0

Java で、文字列を vigenere 暗号のようにエンコードするプログラムを作成しようとしています。実行例は次のようになります

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

in.txt は ATTACKATDAWN を読み取る必要があり、out.txt は LXFOPVEFRNHR を読み取る必要があります。使用される引数の数が不十分な場合は、使用法ステートメントを出力する必要があります。ただし、これに対して暗号化メソッドを実行すると、「?????????£?」が返され、THAT に対して復号化メソッドを実行すると、「?? ???? ???」が返されます。 ?" であり、必要な 2 つの引数よりも少ない数を入力すると、返されます

スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException: 1 at 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;
}
}

正直なところ、自分が何を間違っているのかわかりません。どんな支援も大歓迎です!

4

1 に答える 1

0

ArrayIndexOutOfBoundsException配列の 2 番目の要素にアクセスするため、次のようになります。

String key = args[1];

の長さをテストする前にargskeyアプリケーションの他の場所を参照していないため、この行を完全に削除してください。(優れた IDE は、これを既に伝えているはずです)。


暗号化コードについては、大文字 (または小文字) のみに制限しない限り、これは非常に難しいと思います。大文字を使用すると仮定すると、ASCII 値から 65 を引くと、便利な 0 ~ 25 の値が得られます。次に、追加、モジュロ 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;
}
于 2015-02-20T09:20:50.837 に答える