2012-03-25 100 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