当前位置: 首页 > 知识库问答 >
问题:

凯撒加密。数组在73中的索引73中越界

傅茂实
2023-03-14

我正在为一个数学演示的凯撒加密代码工作。今天,我一直在为我的演示文稿编码。早上这个代码已经开始工作了。但是现在在学校,我遇到了一个例外,我认为,的数超过了我的符号表的长度。

例外情况:

如果有人能查看我的代码,我会很高兴,因为我,以我3个月的编码经验,不能理解发生了什么。

//Alphanumeric table
    final static char[] symbs = new char[] {'.',',','1','2','3','4','5','6','7','8','9','0','/','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a',' '
                    ,'ß','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','ä','ö','ü','Ü','Ö','Ä'};
    final static int charlength = 73;

    //var global key
    int key = 0;

    //en- and decryption vars
    char[] letters = new char[255];
    char[] storg = new char[255];
    char[] sterg = new char[255];
    StringBuilder str = new StringBuilder();
    int cnt = 0;
    int cnt2 = 0;
    int c = 0;
    String bakToStr;

textField1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                char iNumber = e.getKeyChar();
                if (!(Character.isDigit(iNumber))
                        || iNumber == KeyEvent.VK_BACK_SPACE
                        || iNumber == KeyEvent.VK_DELETE) {
                    e.consume();
                    JOptionPane.showMessageDialog(contentPane, "Nur Zahlen werden als schlüssel akzeptiert", "Achtung!", JOptionPane.INFORMATION_MESSAGE);
                }
            }
        });

public String encrypt(String Text) {
        letters = new char[255];
        storg = new char[255];
        sterg = new char[255];
        str = new StringBuilder();
        cnt = 0;
        cnt2 = 1;
        c = 0;
        bakToStr = "";
        for (int i = 0; i <Text.length(); i++) {
            letters[i] = Text.charAt(i);
        }
        for (; cnt < Text.length(); cnt++) {
            for (;letters[cnt] != symbs[cnt2];cnt2++) {
            }
            c = (cnt2 + key) %charlength;
            storg[cnt] = symbs[c];
            cnt2 = 0;
        }
        str.append(storg);
        bakToStr = String.valueOf(str);
        return bakToStr;
    }

    public String decrypt(String Text) {
        letters = new char[255];
        storg = new char[255];
        sterg = new char[255];
        str = new StringBuilder();
        cnt = 0;
        cnt2 = 1;
        c = 0;
        bakToStr = "";
        for (int i = 0; i <Text.length(); i++) {
            letters[i] = Text.charAt(i);
        }
        for (; cnt < Text.length(); cnt++) {
            for (;letters[cnt] != symbs[cnt2];cnt2++) {
            }
            c = (cnt2 - key) %charlength;
            while (c <= 0) {
                c += charlength;
            }
            storg[cnt] = symbs[c];
            cnt2 = 0;
        }
        str.append(storg);
        bakToStr = String.valueOf(str);
        return bakToStr;
    }

共有1个答案

史弘致
2023-03-14

请考虑这句话:

while (c <= 0) {
    c += charlength;
}

如果c==0会发生什么?我认为它将跳转到73,即charlengt。因此,这里更好的方法是使条件while(c<0)而不是while(c<=0)

但是,我认为最主要的问题是第三个for循环:

for (;letters[cnt] != symbs[cnt2];cnt2++)

我希望它能有所帮助:)

 类似资料:
  • 我需要编写一个python、hacker和wow这些单词的加密文本,并且使用不包括使用RAW_INPUT的python中的凯撒密码,距离为3。这是我到目前为止,但我不断得到一个错误消息,我不知道如何修复它。

  • 我想知道如何限制加密的ASCII范围从32-126。 这个是用来解密的 我的加密工作得很好(当我引用解密函数时),但我的解密并不像它应该的那样工作。 额外注意:我们只需要在编码时进行右移,给出一个字符串供整个程序加密和解密(“这是C++”) 注意:在添加更多代码描述的过程中

  • 问题内容: 我通过java进行了凯撒密码,它可以运行,但是在用户输入密钥后不对任何内容进行加密! 这是我的代码 跑: 问题答案: 使用效率不是很高…您可以对值进行整数运算以获得其索引。 我在代码中添加了注释以解释更多信息,但这就是我想出的。 输出应该是这样的

  • 和BOSSLiu下完棋,绝影虽然赢了,但心情反而很郁闷。这世界上最郁闷的事情就是明明有好事,你非得把它憋在心中,真比憋尿还痛苦。下赢了棋,本来应该是件值得高兴的事,平时任凭你把自己吹得再悬乎,可别人毕竟是外行阿,你说什么西班牙布局西西里防御双马防御,任你说得热火朝天,别人听都听不懂,最后还是只得问:“赢过多少人?” 这时候,绝影只有极不情愿地说:“其实还没赢过,主要没人跟我下……” 虽然你强调的是

  • 示例:返回。如果给定的整数值小于0或大于26,则应返回空字符串。 我的问题是,作为回报,它只给我真或假。如何解决这个问题:该方法应该返回一个字符串,其中每个字符都是根据指定的整数值移动的。

  • 首先,我是编程的新手,所以要温柔。而且,我一直在做这个任务,但没有任何结果。任务是创建一个凯撒密码程序,它加密或解密一个段落最多100个字符。实际上是两个独立的实验室。第一个实验是加密,然后第二个实验是解密。一旦我弄清楚了如何创建加密程序,解密程序应该很简单,因为我可以只进行语义更改来解密而不是加密。无论如何,这是我到目前为止的代码。它通过了他们给我们的5个测试中的4个,但出于某种原因,有一个测试