2013-02-24 91 views
1

我寫了一個Java程序,用Vigenere密碼進行編碼的加密工作正常,但解密不適用於一些特殊情況。Vigenere解密奇怪

例如,如果解密時明文是數 'k',密鑰爲 'y' 的它正確地產生密文的 'i'((10 + 24 = 34%26 = 8))

然而((8-24)= -16%26 = -16)),即使它是正值,也是Q.當它應該正確地解密回''時, k'這將是10.

任何人都可以幫助我嗎?如果需要,我可以發佈更多代碼。

---鏈接到維基Viginare加密算法http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher ---

 //decryption 
    else{ 
     for (int i=0; i < a.length(); i++){ 

       for (int j=0; j < full.length(); j++){ 
        //finding the index of the current cipher text letter 
        if (a.charAt(i) == full.charAt(j)){ 
         positionP = j; 

        } 
        //finding the index of the current key letter 
        if(key.charAt(i)==full.charAt(j)){ 
         positionK = j; 
        } 


       } 
       //using the formula for vigenere encoding it adds the newly encrypted character to the output 
       output = output + full.charAt((positionP - positionK)%26); 
      } 
     } 

回答

3

注意,在Java中的餘運算符被定義爲使得結果的幅度總是小於除數的幅度較小,如果分紅爲負數,剩餘操作的結果爲負數[JLS]

可在通過執行獲得期望的輸出:

output = output + full.charAt((positionP - positionK + 26)%26); 

positionP-positionK如果是肯定的,除了不改變的結果(因爲26%26 = 0)。如果positionP-positionK爲負值(介於-25和0之間),那麼positionP - positionK + 26將爲非負值,從而產生正確的結果。

+0

太謝謝你了!我真的被困住了,我發現好奇的是沒有任何解密Vigenere的算法提到了這個!他們通常會說:(CipherTextIndex - keyTextIndex)%26 = IndexOfPlainText 我可能會在wiki中添加一條關於此的註釋。 非常感謝你! – 2013-02-24 18:51:45

+0

@Luke它依賴於你如何定義負數的其餘部分。見 http://stackoverflow.com/questions/4403542/how-does-java-do-modulus-calculations-with-negative-numbers – Javier 2013-02-24 18:58:09

1

如果你的密鑰是'y'= 24,你的字母表的長度是26,你必須將字母鍵= 26 - 24 = 2進行解密。你總是要添加,然後計算國防部26

所以,你的代碼必須是

 //decryption 
else{ 
    for (int i=0; i < a.length(); i++){ 

      for (int j=0; j < full.length(); j++){ 
       //finding the index of the current cipher text letter 
       if (a.charAt(i) == full.charAt(j)){ 
        positionP = j; 

       } 
       //finding the index of the current key letter 
       if(key.charAt(i)==full.charAt(j)){ 
        positionK = j; 
       } 


      } 
      //using the formula for vigenere encoding it adds the newly encrypted character to the output 
      output = output + full.charAt((positionP + (26-positionK))%26); 
     } 
    }