2015-09-20 54 views
0

所以我做了這個任務,最後我轉過來了,但在我的心裏,我覺得我沒有正確編寫程序。它在吃我,我真的想明白我做錯了什麼。所以這裏是代理人:我錯過了什麼使它成爲一個簡單的替代密碼來加密和解密消息?

編寫一個程序,可以使用 任意替換密碼進行加密和解密。在這種情況下,加密陣列是所有可打印ASCII字符(包括 字符:空格)的隨機混排 。

還包括了一個洗牌的想法:

import java.util.Arrays; 
import java.util.Collections; 

    public class Main { 
     public static void main(String[] args) { 
     Character[] original = new Character[]{'A', 'B', 'C', 'D', 'E'}; 
     Character[] encrypted = new Character[]{'A', 'B', 'C', 'D', 'E'}; 

     Collections.shuffle(Arrays.asList(encrypted)); 
     System.out.println(Arrays.toString(encrypted)); 
     } 
    } 

,這就是我想出了:

import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.Random; 
import java.util.Scanner; 

public class Caesar { 

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

     System.out.println("Enter anything: "); 
     String input = keyboard.nextLine(); 

     char[] original = input.toCharArray(); 
     char[] encrypted = input.toCharArray(); 
     String a = new String(original); 

     // Ask if we would like to encrypt 
     System.out.print("Shall we encrypt? (Y/N): "); 
     char selection = keyboard.next().charAt(0); 
     selection = Character.toUpperCase(selection); 

     if (selection == 'Y') { 
      // Encryption process 
      shuffleArray(encrypted); 
      System.out.print("Encrypted message: "); 
      for (int i = 0; i < encrypted.length; i++) { 
       System.out.print(encrypted[i]); 
      } 
      System.out.println(); 
      System.out.print("Shall we decrypt? Y/N: "); 
      selection = keyboard.next().charAt(0); 
      selection = Character.toUpperCase(selection); 
      if (selection == 'Y') { 
       System.out.println("Decrypted message: " + a); 
      } 
     } else if (selection == 'N') { 
      System.out.print("Nothing was done to the text: " + a); 
     } else { 
      System.out.println("You must enter either Y or N!"); 
     } 
    } 

    static void shuffleArray(char[] ar) { 
     Random random = new Random(); 

     for (int i = ar.length - 1; i > 0; i--) { 
      int index = random.nextInt(i + 1); 
      // Simple swap 
      char a = ar[index]; 
      ar[index] = ar[i]; 
      ar[i] = a; 
     } 
    } 
} 

它開始作爲一個愷撒密碼,但我厭倦了和最後簡單地使用隨機洗牌,問題是加密僅適用於該實例。我希望能夠可靠地解密消息,即使在其間發生其他實例。我幾乎可以在腦海中看到解決方案,但這只是遙不可及。任何人都可以幫我連接點嗎?

回答

0

這些說明沒有意義。加密的原理是

  • 你有一些明文加密
  • 你有一個祕密密鑰您使用該密鑰來

密文加密的明文應用算法

  • 必須如果您知道密鑰,則可以將其轉換回明文。因此,在說明中,老師稱之爲「加密陣列」,可能是祕密密鑰。

    您的算法只是隨機洗牌明文,不使用任何鍵。所以再也無法解密了。例如,如果您收到「lloa」作爲加密文本,則明文可能是「allo」或「lola」,並且無法知道。

    這是我認爲老師的意思。

    是27個元素的數組,其中包含隨機順序中的所有字母+空格。例如:

    K I Z R ... 
    

    由於K是在關鍵中的第一位置,這意味着所有的明文中出現的A必須轉化爲K.由於I是在關鍵中的第二位置,即意味着明文中的所有B都必須轉換爲I等等。

    解密算法很簡單,如果您知道密鑰:K必須轉換爲A,我必須轉換爲B等。

    Collections.shuffle()只是一個從字母數組中生成隨機密鑰的簡單方法。一旦你有一個隨機密鑰,你可以用它來加密明文,然後解密加密的文本。測試很簡單:解密文本必須等於原來的明文(前提是你使用相同的密鑰,當然)。