使用java的Cesar密码描述

使用java的Cesar密码描述,java,encryption,caesar-cipher,Java,Encryption,Caesar Cipher,我试图用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 - re

我试图用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("");

    }  
}
/**
*在这里写一个类Main的描述。
*
*@author(你的名字)
*@version(版本号或日期)
*/
公共班机
{
//实例变量-将下面的示例替换为您自己的
私有字符串消息;
私钥;
私人INTC;
/**
*类Main的对象的构造函数
*/
公用干管()
{
//初始化实例变量
//y是76 ascii
消息="在本次会议上,中国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团成员国代表团蒙牛BcGnBcGnBcGnBcGnBcGnBcGnBcNyFnYFcHyWyWyWyWyWyWyWyWfFnByWyWyWyWyWyWyWyWyWyWyWnByWnByWnByWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyWyZihxfsxlyugyxqbsbuxbyhinmnicwuffsuvuhxyxyxyxylchzcxyfcnsnibcjlchwcjfymnbcmqbunbyxinvsujimnumsuhxbcmjohcmbgyhnqymylpyxnbyywywyqyul”;
对于(int a=0;a
应该是

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

  • message.charAt(i)
    是介于65(
    a
    )和90(
    Z
    )之间的数字

  • message.charAt(i)-“A”则是一个介于0和25之间的数字

  • 的值应介于0和25之间

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

  • 加在一起是一个介于1和51之间的值

  • (…)%26
    是一个介于0和25之间的值

  • 最后,
    …+'A'
    是介于65(
    A
    )和90(
    Z
    )之间的值

应该是

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

  • message.charAt(i)
    是介于65(
    a
    )和90(
    Z
    )之间的数字

  • message.charAt(i)-“A”则是一个介于0和25之间的数字

  • 的值应介于0和25之间

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

  • 加在一起是一个介于1和51之间的值

  • (…)%26
    是一个介于0和25之间的值

  • 最后,
    …+'A'
    是介于65(
    A
    )和90(
    Z
    )之间的值



基本上,每次离开大写字母范围时,您必须试用26个键(基本上,每次离开大写字母范围时,您必须试用26个键(英文字母表中有26个字母,那么为什么循环使用27,而余数运算符使用23?为什么循环字符串和字母表。您只需查看字符串中的每个字符,并将其替换为移位值。同样,在Cesar密码中,密钥不会更改。@mavriksc OP不知道密码密钥,所以代码不会更改。)ries所有26个可能的密钥。尝试使用蛮力破解加密。确切地说,我不知道密钥是什么,所以我使用所有可能的密钥来破解它。也是的,我刚刚意识到我需要一个26的循环,这与模块有关,模块导致代码失败,但无法解决它。英语中有26个字母phabet,那么为什么循环使用27,而余数运算符使用23?为什么循环字符串和字母表。您只需要查看字符串中的每个字符并用移位值替换它。同样,在Cesar密码中,密钥不会更改。@mavriksc OP不知道密码密钥,所以代码会尝试所有26个可能的密钥。尝试使用蛮力破解加密。确切地说,我不知道密钥是什么,所以我使用所有可能的密钥来破解它。还有,是的,我刚刚意识到我需要一个26的循环,这与模块有关,模块使代码失败,但无法解决它。谢谢你的帮助!程序现在返回所有大写字母,但im g将表示“java.lang.arithmetricException:/”的错误代码设置为零“我认为与键变为0有关吗?@OllieJones因为唯一的除法/余数运算是通过硬编码的
26
,我不知道如何获得零除法异常。谢谢你的帮助!该程序现在返回所有大写字母,但我收到一个错误代码说“java.lang.arithmetricException:/by零"我认为with与键变为0有关?@OllieJones因为唯一的除法/余数运算是通过硬编码的
26
,我不知道如何获得零除法异常。为什么从
-1
开始?迭代范围
-1
25
,这似乎有点奇怪。我的第一步是t消息的第一个字母是Y,你可以用-1来表示Z,也可以用-25来表示A(以及介于两者之间的所有内容)在第二步中,我不得不处理其他字母,在这里你得到了ouf的范围,因此必须加上+26。你是对的,
'Y'-1
'Z'
,但是
'Y'-25
'
。要得到
'A'
,你需要
'Y'-24
。如果这是你的目标,那应该是
(int a=-1;a为什么从
-1
开始?迭代范围
-1
25
,包括在内,似乎有点奇怪。我的第一步是消息的第一个字母是Y,你可以做-1到m
    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());
        }
    }