使用 java 的 Cesar 密码解密

Cesar Cipher Decription using java

我正在尝试使用 Java 解密此 Cesar 密码,但似乎无法获得使用密钥正确解密代码的代码。我使用 for 循环遍历所有可能的密钥并打印出解密版本。解密后的文本应该只有大写字母。

/**
 * Write a description of class Main here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class Main
{
    // instance variables - replace the example below with your own
    private String message;
    private int key;
    private int c;


    /**
     * Constructor for objects of class Main
     */
    public Main()
    {
        // initialise instance variables
        // y is 76 ascii
        message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
        for(int a = 0; a<27; a++)
        {
            key = a;

            for(int i=0; i<message.length(); i++)
            {

                char ch;
                c = message.charAt(i)-key%23;
                ch =(char) (c);
                System.out.print(ch); 


            }
            System.out.println("");
        }

    System.out.println("");

    }  
}

如有任何帮助,我们将不胜感激。

c = message.charAt(i)-key%23;

应该是

c = (message.charAt(i) - 'A' - key + 26) % 26 + 'A';

因为:

  • message.charAt(i) 是一个介于 65 (A) 和 90 (Z)

  • 之间的数字
  • message.charAt(i) - 'A' 是 0 到 25 之间的数字

  • key 应该是 0 到 25 之间的值

  • 我们希望结果为正,所以- key + 26是一个介于1和26之间的值

  • 相加是1到51之间的一个值

  • (...) % 26则为0到25之间的值

  • 最后 ... + 'A' 是一个介于 65 (A) 和 90 (Z)

  • 之间的值

基本上你必须尝试 26 个密钥,每次你离开大写字母的范围(<65)你添加 26。显然你正在寻找破译你的消息的密钥是 20。

    String message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
    for(int a = -1; a<26; a++)
        {
            StringBuilder sb = new StringBuilder();
            for(int i=0; i<message.length(); i++)
            {
                char ch = message.charAt(i);
                int chAscii = (int) ch;
                chAscii -= a;
                if (chAscii < 65) {
                    chAscii = 26 + chAscii;
                }
                char newChar = (char) (chAscii);
                sb.append(newChar);
            }
            System.out.println("For key = "+a+" the message is "+sb.toString());
        }
    }