需要帮助解决我的VigenereCipher java代码问题

时间:2015-10-10 23:13:31

标签: java encryption command-line vigenere

好的,所以我去年为一个课程项目创建了这个代码,我记得它正常工作。我现在需要它来实现文本密码,但由于某种原因它无法正常工作。它会加密,但是当我尝试解密时,只有前两个字母是正确的。其余的都是错的。它非常简单,它是一个命令行程序,其中第一个参数是加密(-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;。

1 个答案:

答案 0 :(得分:0)

您忘记了您的密钥也需要使用相同的字母。因此,如果您提供小写密钥,则算法将失败。

当您将算法分成若干部分时,这将变得非常清晰,例如:我刚刚经历过:

int im = c + key.charAt(j) - 2 * 'A';
res += (char)(im % 26 + 'A');

使用我的调试器和presto,问题出现了。