2012-03-25 107 views
0

我正在尝试做一个Vigenere密码程序,但我在解密代码部分时遇到了一些麻烦。有趣的是,我想如果我的代码的加密部分工作,解密,只会是相反的。大部分情况是这样,但只有一个小问题。解密代码错误

让我首先解释程序试图做什么: 我的整个程序是从用户那里得到一个文本文件,并且一个关键词(必须是字母和小写),并将单个字母根据关键词将该文本文件的内容分配到特定位置。对于这段代码的解密部分,我只需要解密一行代码,另一部分程序将负责保持解密,直到它到达文本文件的末尾。为简单起见,我们假设文本是“oexl”,关键是“猫”,如果解密工作,结果应该是“meet”,但是我的代码以“meeZ”结尾。

我知道怎么回事错了,但我不确定如何解决它。我尝试了各种方法,最终的结果一直在变糟。

为代码的问题部分,我试图与此替换它的if语句

Character.isLetter(文本2)& & line.charAt(I)> = 97 & & line.charAt(ⅰ )< = 122 & &的text1> = 65 & &的text1 < = 90

这并不工作。

我想出的另一个想法是if语句,它首先测试以查看文本中的原始字符是否为字母,如果是,则通过移动位置减去该字符,如果该数字少于比97(这是a的ascii值),然后将25添加到该数字以将其带到z。例如。假设原始字母是l(ascii值为108),键是s(ascii值为115,通过ascii值(97),结果18表示该字母必须移位18位)。我接下来做的是从108(l)中减去18,我得到了90.之后,我将这个数字与97相比较(小写字母a的ASCII值)由于90小于97,程序应该做的是将25加到108 ,我得到133.减去113(文本需要改变的位置数)113,我得到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++; 
+0

可能重复http://stackoverflow.com/questions/9853285/vigenere-cipher-program-in:D与像环路的其余部分在适合它-java) – Jeffrey 2012-03-25 16:49:06

+0

那也是我。我正在研究我的程序的加密部分。这一个是关于解密。对于大多数部分来说,它们是相同的,但是我只用一小部分代码就有点困难。 – ScoutBlade 2012-03-25 16:54:49

回答

1

你的条件只需要检查,如果字符是小写的,现在是< 'A',或者是大写的,现在是< '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); 
    } 
} 
[Java中V @ genere加密程序(的
+0

是的,是的。非常感谢。这解决了这个问题。但是,当我进行一些测试时,出现了另一个问题。我注意到,对于每一封需要阅读的信件,最终的结果总是以该信件前面的额外大写字母结尾。假设文本是Oexl,关键是猫,结果我应该满足,但实际结果是MeeZ。所以它是关闭的,并且在角色面前总是需要额外的大写字母。代码的加密部分也发生了同样的情况。你能看看代码,看看有什么不对吗?谢谢 – ScoutBlade 2012-03-25 17:45:10

+0

我做了一些测试,我想我知道为什么在角色面前需要额外的大写字母。文本再次是Oexl,关键是猫。因此,对于第一条if语句,它会一直持续到达到l。现在程序转换字符,它是Z.然后程序转到第二个if语句并进行测试并看到它是Z.然后它将text1加上26来回头。该计划需要做的是在附加t到Mee的结尾之前丢弃大写字母Z.我想看看我是否记得放弃角色的代码。 – ScoutBlade 2012-03-25 18:07:55

+0

@ScoutBlade代码有两次“text4 + = text3”。你可以在if之后做一次,或者作为if的其中一部分来做。一个是因为你添加25而不是26. – fgb 2012-03-25 18:08:54