2016-11-02 46 views
0

下面的代碼是爲了加密和解密消息輸入當。當我對數據進行加密和解密時,它有時會起作用,而在其他時候則不起作用。以下是我遇到的問題的一個例子。在輸出結束看似隨機字符使用掃描儀

加密

Encryption

解密

Decryption

正如你所看到的,當我嘗試解密,我的程序終止,一些亂碼輸出到控制檯。我的代碼有什麼問題?

我不能確定提這會有所幫助,但我有Eclipse的文件的編碼設置爲UTF-8。

請原諒任何代碼很差。我仍然是Java的初學者,我爲此感到困惑。

import java.util.Scanner; 

public class Transcrypt { 

    static String mode = "", 
        msg, 
        key; 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     while (!mode.equals("e") && !mode.equals("d")) { // Ask for mode until equal to "e" or "d" 
      System.out.print("Encrypt or decrypt? (e/d) "); 
      mode = input.nextLine().toLowerCase(); 
     } 

     System.out.print("Message: "); // Ask for message 
     msg = input.nextLine(); 

     System.out.print("Passkey: "); // Ask for key 
     key = input.nextLine(); 

     input.close(); 

     System.out.println(transcrypt(msg, key, mode.equals("d"))); // Transcrypt and output 
    } 

    public static String transcrypt(String msg, String key, boolean decode) { 
     String result = ""; 

     for (int i=0; i<msg.length(); i++) { 
      // Add or subtract Unicode index of key.charAt(i % key.length()) and/from msg.msg.charAt(i) and convert back to character 
      result += (char) ((int) msg.charAt(i) + ((int) key.charAt(i % key.length())) * (decode ? -1 : 1)); 
     } 

     return result; 
    } 

} 
+3

似乎是某種形式的終端問題。在終端中使用二進制字符不一定是個好主意。您可以將您的二進制字符串編碼/解碼爲base64或hex,但要解決控制檯問題。 –

+0

或者,傳統的(16世紀)Vigenere只加密字母並在字母表中環繞:X + A = Y,X + B = Z,X + C = A,X + D = B。經常需要處理一些空格和非空格,比如在模糊的時候在單詞之間使用X,並用單詞STOP QUERY ONE TWO TH等替代。另外注意,如果用於任何重要長度的真文本,Vigenere很容易被破壞;請參閱維基百科。 –

回答

1

你的編碼信息是這樣的"¼ÊßàãÊãæÑ×",但實際上,它是"¼Êßàã\u0085ÊãæÑ×\u0095"

最值得注意的是,它包含了控制字符0x85在兩者之間具有「新線」的語義。所以複製該字符串時,你複製它的控制字符並粘貼到在你的應用程序的信息查詢控制檯時,你基本上進入¼Êßàã的消息,通過「新線」控制字符犯下的輸入,造成隨後的密碼查詢消耗尾隨的ÊãæÑ×字符。

Passkey:輸出之後看到的垃圾,是您嘗試使用該密鑰ÊãæÑ×解碼¼Êßàã的結果,因爲是在控制檯的緩衝區已經字符都沒有使用新行此時進入。

通常,正如NándorElődFekete在this comment中所說的那樣,您不應該將字符寫入控制檯,它們實際上是二進制數據,例如編碼字符串。


順便說一句,你不應該變量聲明爲static字段實際上是當地的一種方法,即你main方法。此外,在進行計算時,您不需要將char轉換爲intchar值已經是int值的子集。