以下代码旨在加密和解密消息输入。当我加密和解密数据时,它有时会起作用,而在其他时候却不起作用。以下是我遇到的问题的一个例子。
加密
解密
正如您所看到的,当我尝试解密时,我的程序终止并且一些乱码输出到控制台。我的代码有什么问题?
我不确定是否提到这有帮助,但我将Eclipse的文件编码设置为UTF-8。
请原谅任何糟糕的代码。我仍然是Java的初学者,我很困惑为什么会这样。
import java.util.Scanner;
public class Transcrypt {
static String mode = "",
msg,
key;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (!mode.equals("e") && !mode.equals("d")) { // Ask for mode until equal to "e" or "d"
System.out.print("Encrypt or decrypt? (e/d) ");
mode = input.nextLine().toLowerCase();
}
System.out.print("Message: "); // Ask for message
msg = input.nextLine();
System.out.print("Passkey: "); // Ask for key
key = input.nextLine();
input.close();
System.out.println(transcrypt(msg, key, mode.equals("d"))); // Transcrypt and output
}
public static String transcrypt(String msg, String key, boolean decode) {
String result = "";
for (int i=0; i<msg.length(); i++) {
// Add or subtract Unicode index of key.charAt(i % key.length()) and/from msg.msg.charAt(i) and convert back to character
result += (char) ((int) msg.charAt(i) + ((int) key.charAt(i % key.length())) * (decode ? -1 : 1));
}
return result;
}
}
答案 0 :(得分:2)
您的编码邮件看起来像"¼ÊßàãÊãæÑ×"
,但实际上是"¼Êßàã\u0085ÊãæÑ×\u0095"
。
最值得注意的是,它包含中间的控制字符0x85
,其中包含“新行”语义。因此,在复制该字符串时,您将使用它复制控制字符,并在应用程序查询消息时粘贴到控制台中,您基本上输入¼Êßàã
作为消息,通过“新行”提交输入控制字符,导致后续查询密码使用尾随的ÊãæÑ×
字符。
您在Passkey:
输出后看到的垃圾是您尝试使用密钥¼Êßàã
解码ÊãæÑ×
的结果,因为此时没有输入换行符已经使用了控制台缓冲区中的字符。
一般来说,正如NándorElődFekete在this comment所说的那样,你不应该在控制台上写字符,实际上是二进制数据,比如编码字符串。
顺便说一下,您不应将变量声明为方法实际上是本地的static
字段,即您的main
方法。此外,在进行计算时,您无需将char
强制转换为int
。 char
值已经是int
值的子集。