我试图在java中编写一个程序来编码像vigenere密码这样的字符串。一个示例运行是
java Encrypt -e lemon < in.txt > out.txt
in.txt应读取ATTACKATDAWN,out.txt应读取LXFOPVEFRNHR,如果使用的args数量不足,则应打印用法语句;但是,当我对此运行加密方法时,它返回“??¡??????????”,如果我在THAT上运行解密方法,则返回“?? ???? ??? ?“,如果我输入少于所需的两个args,则返回
线程“main”中的异常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 :(得分:0)
你得到一个ArrayIndexOutOfBoundsException
,因为你访问了数组的第二个元素:
String key = args[1];
在您测试args
的长度之前。完全摆脱这一行,因为你没有在应用程序的任何其他位置引用key
。 (一个好的IDE应该已经告诉过你了。)
对于您的加密代码,我认为除非您将自己仅限于大写(或小写)字母,否则您会发现这非常具有挑战性。假设您选择大写,那么从ASCII值中减去65将为您提供方便的0-25值。然后你可以使用addition,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;
}