0

解読プログラムが正しく動作していません...

  public static void decipherMessage() { 

    Scanner sc = new Scanner(in);

    System.out.println("Enter keyword: "); 
    String decipher = sc.nextLine(); 

    String plain = ("abcdefghijklmnopqrstuvwxyz"); 
    String cipher = decipher + "abcdefghijklmnopqrstuvwxyz";

    System.out.println("Enter enciphered message: ");
    String ciphMsg = sc.nextLine(); 

    String decipherMessage = ciphMsg.toLowerCase();

    char[] chars = cipher.toCharArray();
    Set<Character> charSet = new LinkedHashSet<Character>(); 

    for (char c : chars) {
        charSet.add(c);
    }

    StringBuilder cMap = new StringBuilder();
    for (Character character : charSet) {
        cMap.append(character);
        StringBuilder original = cMap;

    }
    for (int i = 0; i < 26; i++)
    {
        char cipherTextChar = cMap.charAt(i);
        char plainTextChar = plain.charAt(i);

        decipherMessage = decipherMessage.replace(cipherTextChar,plainTextChar); 

        System.out.println("Deciphered message");  
        System.out.println(decipherMessage);


    }

平文の文字は暗号化された文字を置き換えることになっています

しかし、それを実行すると、解読せずに暗号化されたメッセージが再び表示されますか?

例。

keyword: stack

plain : abcdefghijklmnopqrstuvwxyz

cipher: stackbdefghijlmnopqruvwxyz

message: overflow

ciphered message: mvhpbimw

逆を除いて。上記のコードを使用すると、何も解読せずに、暗号化されたメッセージが再び表示されます。

4

1 に答える 1

0

あなたのコードは文字を置き換えますが、正しくはありません(上記の使用法がタイプミスであると仮定しdeciphMsgますdecipherMessage。それらは同じ変数でなければなりません)。

問題の1つは、一度に1文字ずつ文字列を置換していることです

たとえば、私の暗号が「b」の場合、すべてのaとbを切り替えることになっていますが、文字列を指定すると

abababababab

まず、すべてのaをbに置き換えます。

bbbbbbbbbbbb

次に、すべてのbをaに置き換えます。

aaaaaaaaaaaa

これは意図した結果ではありません。

解決策は基本的に、一度に1つのメッセージ文字を置き換えることです。そのためのメッセージをループする必要があります。マップを使用して効率的にすることもできます。

于 2012-05-17T15:56:00.130 に答える