好的,所以我去年为一个课程项目创建了这个代码,我记得它正常工作。我现在需要它来实现文本密码,但由于某种原因它无法正常工作。它会加密,但是当我尝试解密时,只有前两个字母是正确的。其余的都是错的。它非常简单,它是一个命令行程序,其中第一个参数是加密(-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
将给我&#34; UOCCI&#34;作为输出,但当我接受输出并做java VigenereCipher -d hello UOCCI
时,它给了我&#34; HE225&#34;作为我的输出而不是&#34; HELLO&#34;。
答案 0 :(得分:0)
您忘记了您的密钥也需要使用相同的字母。因此,如果您提供小写密钥,则算法将失败。
当您将算法分成若干部分时,这将变得非常清晰,例如:我刚刚经历过:
int im = c + key.charAt(j) - 2 * 'A';
res += (char)(im % 26 + 'A');
使用我的调试器和presto,问题出现了。