在不知道密钥但知道明文将包含的单词之一的情况下解密移位密码的方法 - Java

Method to decrypt a shift cipher without knowing the key but knowing one of the words that the plaintext will contain - Java

我目前正在尝试编写一个应用程序,该应用程序应该从文件中读取密文并在不知道密钥但知道字符串中的一个单词是“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;
    }

你嵌套了三个循环

a) while
b) -- for
c)    -- for

您的外部 for 循环 b) 不断遍历所有键,即使它设置了 keyFound = true。这是因为您使用 keyFound 作为 a) 而不是 b) 的退出条件。所以 b) 将继续,直到它尝试了所有键,然后 a) 被重新评估。请注意,如果没有匹配的键,while 循环将永远不会终止。

此外,嵌套循环通常被认为是一种代码味道。您可能只想完全删除外部 while 循环,并只坚持使用 b) 和 c) 作为第一步。要终止外部 for 循环,请使用 break 语句而不是布尔标志。这是一些示例 https://www.tutorialspoint.com/java/java_break_statement.htm