2015-09-20 28 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()只是一个从字母数组中生成随机密钥的简单方法。一旦你有一个随机密钥,你可以用它来加密明文,然后解密加密的文本。测试很简单:解密文本必须等于原来的明文(前提是你使用相同的密钥,当然)。