Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法解密移位密码,而不知道密钥,但知道明文将包含的字之一-Java_Java_Encryption_Key_Shift - Fatal编程技术网

方法解密移位密码,而不知道密钥,但知道明文将包含的字之一-Java

方法解密移位密码,而不知道密钥,但知道明文将包含的字之一-Java,java,encryption,key,shift,Java,Encryption,Key,Shift,我目前正在尝试编写一个应用程序,该应用程序应该读取文件中的密文,并使用shift密码对其进行解密,而不知道密钥,但知道字符串中的一个单词是“DONE”。 这就是我到目前为止所使用的方法,它遍历所有25个键,我试图检查String.contains(“DONE”)是否包含,但无论出于何种原因,该方法甚至不承认特定if语句的存在,只是遍历所有25个键。我知道答案可能很明显,但我就是看不到。。。这是我的密码: public String decryptUnknownKey() {

我目前正在尝试编写一个应用程序,该应用程序应该读取文件中的密文,并使用shift密码对其进行解密,而不知道密钥,但知道字符串中的一个单词是“DONE”。 这就是我到目前为止所使用的方法,它遍历所有25个键,我试图检查String.contains(“DONE”)是否包含,但无论出于何种原因,该方法甚至不承认特定if语句的存在,只是遍历所有25个键。我知道答案可能很明显,但我就是看不到。。。这是我的密码:

public String decryptUnknownKey()
    {
        char[] ciphertext = this.ciphertext.toUpperCase().toCharArray();
        char c;
        char[] plaintext = new char[ciphertext.length];
        String test = "";
        String search = "DONE";
        boolean keyFound = false;

        while(!keyFound)
        {
            for (int key = 1; key < 25; key++)
            {
                for (int i = 0; i < ciphertext.length; i++)
                {
                    if(ciphertext[i] >= 'A' && ciphertext[i] <= 'Z')
                    {
                        c = (char) (Math.floorMod(ciphertext[i] - 65 - key, 26) + 65);
                        plaintext[i] = c;
                    }
                    else if(Character.isWhitespace(ciphertext[i]) == true)
                    {
                        plaintext[i] = 32;
                    }
                }
                test = String.valueOf(plaintext);
                if (test.contains(search))
                {
                    keyFound = true;
                }
            }
        }
        return test;
    }
公共字符串解密Unknownkey()
{
char[]ciphertext=this.ciphertext.toUpperCase().toCharArray();
字符c;
char[]明文=新字符[ciphertext.length];
字符串测试=”;
字符串搜索=“完成”;
布尔键发现=假;
而(!keyfind)
{
用于(int key=1;key<25;key++)
{
for(int i=0;i如果(密文[i]>='A'&&ciphertext[i]您嵌套了三个循环

a) while
b) -- for
c)    -- for
您的外部for循环b)将继续在所有键上循环,即使它将keyfind设置为true。这是因为您将keyfind用作a)的退出条件,而不是b)。因此b)将继续,直到它尝试了所有键,然后才重新评估a)。请注意,如果没有适合的键,while循环将永远不会终止


另外,嵌套循环通常被认为是一种代码味道。您可能只想完全删除外部while循环,并将仅使用b)和c)作为第一步。要终止外部for循环,请使用break语句而不是布尔标志。以下是一些示例

非常感谢。这确实解决了我的问题。我试图避免使用我们ing break,因为我的讲师说我们可能会过度使用它,但我想在这个例子中这是必要的。好吧,你的讲师部分正确地指出,break不是最佳选择,但imho,他的推理是错误的。嵌套循环和使用break通常是错误代码设计决策的标志。在你的具体案例中,我认为,可以使用,因为您正试图找到第一个适合的键。我认为,您可能希望将内部循环放置在它自己的函数中,该函数返回纯文本字符串。外部for循环将更易于阅读和理解。另外,请注意,您也可以通过使用类似“if test.contains(search)”的返回来打破循环{返回测试}