解密代码出错

时间:2012-03-25 16:46:05

标签: java

我正在尝试做一个Vigenere密码程序,但是我在代码的解密部分遇到了一些麻烦。有趣的是,我认为如果我将代码的加密部分工作,解密就会反过来。在大多数情况下,它是,但只有一个小问题。

首先让我解释一下该计划正在尝试做什么: 我的整个程序是从用户那里获得一个文本文件,以及一个关键词(必须是字母和小写),并根据关键词将该文本文件的各个字母移动到某些位置。对于代码的这个解密部分,我只需要解密一行,程序的另一部分将负责保持解密,直到它到达文本文件的末尾。为简单起见,假设文本为“oexl”,密钥为“cats”,如果解密有效,结果应该是“meet”,而我的代码最终会以“meeZ”结束

我知道出了什么问题,但我不确定如何修复它。我尝试了各种各样的方式,最终结果不断恶化。

对于代码的问题部分,我尝试将其替换为if语句

Character.isLetter(text2)&& line.charAt(i)> = 97&& line.charAt(i)< = 122&& text1> = 65&& text1< = 90

那不起作用。

我提出的另一个想法是if语句首先测试文本中的原始字符是否为字母,如果是,则按移位位置减去该字符,如果该字符小于97(这是a的ascii值),然后将25添加到该数字以将其带到z。例如。假设原始字母是l(ascii值108),键是s(ascii值115,按a(97)的ascii值sutract那个数字,结果18,表示字母必须移位18位)。我接下来要做的是从108(l)中减去18,得到90.然后,我将这个数字与97(小写a的ascii值)进行比较。由于90小于97,程序应该做的是添加25到108 ,我得到133.减去113乘以18(文本需要移位的位数),我得到116,这是t的ascii值。问题是,我不确定如何实现此代码。

非常感谢您的帮助。

        if (Character.isLetter(line.charAt(i))){


        int text1 =  line.charAt(i) - (key.charAt(j%(key.length()))-'a');  

        char text2 =(char)text1;
        String text3 = Character.toString(text2);
        text4 += text3;
        System.out.println(text4);


        if (text1<= 65 || (text1 >90 && text1 <97)) {
        text1 = text1 + 26;
         text2 =(char)text1;
         text3 = Character.toString(text2);
        text4 += text3;

        }
        j++;

1 个答案:

答案 0 :(得分:1)

您的情况只需要检查该字符是否为小写,现在是&lt; 'a',或者是大写的,现在是&lt; 'A':

if (text1 < 'A' || (text1 < 'a' && line.charAt(i) > 'a')) {
    text1 = text1 + 26;
    text2 = (char)text1;
    text3 = Character.toString(text2);
    text4 += text3;
}

编辑:我会将其与循环的其余部分相符合:

for(int i = 0; i<= line.length()-1; i++) {
    if (Character.isLetter(line.charAt(i))) {
        int text1 =  line.charAt(i) - (key.charAt(j%(key.length()))-'a');  

        if (text1 < 'A' || (text1 < 'a' && line.charAt(i) > 'a')) {
            text1 = text1 + 26;
        }
        text4 += (char)text1;
        j++;
    } else {
        text4 += line.charAt(i);
    }
}