需要帮助解决我的 VigenereCipher java 代码
Need help troubleshooting my VigenereCipher java code
好吧,我去年为一个 class 项目创建了这段代码,我记得它工作正常。我现在需要它来实现文本密码,但由于某种原因它不能正常工作。它会加密,但当我尝试解密时,只有前两个字母是正确的。其余的都是错误的。它非常简单,它是一个命令行程序,其中第一个参数是加密(-e)还是解密(-d),第二个参数是密钥,第三个参数是您要加密的文本。它类似于凯撒密码,不同之处在于它在添加到字符串中的每个单独字符时将每个字符作为参考。谁能告诉我出了什么问题,我不明白为什么它不再起作用了,我需要它来做一个项目。
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".
您忘记了您的密钥也需要使用相同的字母表。因此,如果您提供小写密钥,您的算法将失败。
当您将算法分成几部分时,这将变得非常清楚,例如我刚经历过:
int im = c + key.charAt(j) - 2 * 'A';
res += (char)(im % 26 + 'A');
使用我的调试器和 presto,问题出现了。
好吧,我去年为一个 class 项目创建了这段代码,我记得它工作正常。我现在需要它来实现文本密码,但由于某种原因它不能正常工作。它会加密,但当我尝试解密时,只有前两个字母是正确的。其余的都是错误的。它非常简单,它是一个命令行程序,其中第一个参数是加密(-e)还是解密(-d),第二个参数是密钥,第三个参数是您要加密的文本。它类似于凯撒密码,不同之处在于它在添加到字符串中的每个单独字符时将每个字符作为参考。谁能告诉我出了什么问题,我不明白为什么它不再起作用了,我需要它来做一个项目。
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".
您忘记了您的密钥也需要使用相同的字母表。因此,如果您提供小写密钥,您的算法将失败。
当您将算法分成几部分时,这将变得非常清楚,例如我刚经历过:
int im = c + key.charAt(j) - 2 * 'A';
res += (char)(im % 26 + 'A');
使用我的调试器和 presto,问题出现了。