Требуется помощь с моей программой шифрования - PullRequest
0 голосов
/ 06 января 2020

Я создал программу шифрования с использованием метода input.replace, так как он должен шифровать ввод пользователя, но у меня возникла проблема, заключающаяся в том, что код никогда не шифруется полностью. Например, если бы я вводил слово «счастливый», то выводил бы слова «haccl», оставляя «h» и «a» нетронутыми, когда они также должны быть зашифрованы. Вот мой код:

public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.print("Input a word: ");
        Scanner inputscan = new Scanner(System.in);
        String input = inputscan.nextLine();

        input = input.replace('A', 'N');
        input = input.replace('B', 'O');
        input = input.replace('C', 'P');
        input = input.replace('D', 'Q');
        input = input.replace('E', 'R');
        input = input.replace('F', 'S');
        input = input.replace('G', 'T');
        input = input.replace('H', 'U');
        input = input.replace('I', 'V');
        input = input.replace('J', 'W');
        input = input.replace('K', 'X');
        input = input.replace('L', 'Y');
        input = input.replace('M', 'Z');
        input = input.replace('N', 'A');
        input = input.replace('O', 'B');
        input = input.replace('P', 'C');
        input = input.replace('Q', 'D');
        input = input.replace('R', 'E');
        input = input.replace('S', 'F');
        input = input.replace('T', 'G');
        input = input.replace('U', 'H');
        input = input.replace('V', 'I');
        input = input.replace('W', 'J');
        input = input.replace('X', 'K');
        input = input.replace('Y', 'L');
        input = input.replace('Z', 'M');
        input = input.replace('a', 'n');
        input = input.replace('b', 'o');
        input = input.replace('c', 'p');
        input = input.replace('d', 'q');
        input = input.replace('e', 'r');
        input = input.replace('f', 's');
        input = input.replace('g', 't');
        input = input.replace('h', 'u');
        input = input.replace('i', 'v');
        input = input.replace('j', 'w');
        input = input.replace('k', 'x');
        input = input.replace('l', 'y');
        input = input.replace('m', 'z');
        input = input.replace('n', 'a');
        input = input.replace('o', 'b');
        input = input.replace('p', 'c');
        input = input.replace('q', 'd');
        input = input.replace('r', 'e');
        input = input.replace('s', 'f');
        input = input.replace('t', 'g');
        input = input.replace('u', 'h');
        input = input.replace('v', 'i');
        input = input.replace('w', 'j');
        input = input.replace('x', 'k');
        input = input.replace('y', 'l');
        input = input.replace('z', 'm');

        System.out.println("After replace: " + input);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2020

В вашем коде вы заменяете буквы несколько раз. Вот мое решение - использовать al oop и заменять буквы одну на другую:

public class HelloWorld {

public static void main(String[] args) {
    System.out.print("Input a word: ");
    Scanner inputscan = new Scanner(System.in);
    String input = inputscan.nextLine();

    StringBuilder stringBuilder = new StringBuilder(input);
    for (int i = 0; i < input.length(); i++) {

        switch (input.charAt(i)) {
            case 'A':
                stringBuilder.setCharAt(i, 'N');
                break;
            case 'B':
                stringBuilder.setCharAt(i, 'O');
                break;

            //Add all the other cases here.

        }
    }
    System.out.println("After replace: " + stringBuilder.toString());
}

}
0 голосов
/ 06 января 2020

Вы можете использовать некоторый тип структуры данных для хранения транспонирования.

  1. Вы можете отобразить каждый символ. Таким образом, вы не будете заменять любые уже замененные замены.
  2. Кроме того, можно также использовать маску для быстрого переключения букв, которые следует игнорировать.
  3. Наконец, вы можете прочитать ключ шифрования в в виде текстового файла и динамически построить карту.

Это похоже на шифр Цезаря, вы можете просто сдвинуть символы, используя известный алгоритм.

import java.util.*;

public class Encryption {
    static final Map<Character, Character> mapping;
    static final Set<Character> mask;

    public static void main(String[] args) {
        System.out.print("Input a word: ");
        Scanner inputscan = new Scanner(System.in);
        System.out.println("After replace: " + encrypt(inputscan.nextLine()));
        inputscan.close();
    }

    private static String encrypt(String plaintext) {
        StringBuffer buff = new StringBuffer();
        for (char ch : plaintext.toCharArray()) {
            buff.append(!mask.contains(ch) && mapping.containsKey(ch)
                    ? mapping.get(ch)
                    : ch);
        }
        return buff.toString();
    }

    static {
        mapping = new HashMap<Character, Character>();
        mask = new HashSet<Character>();

        mapping.put('A', 'N');
        mapping.put('B', 'O');
        mapping.put('C', 'P');
        mapping.put('D', 'Q');
        mapping.put('E', 'R');
        mapping.put('F', 'S');
        mapping.put('G', 'T');
        mapping.put('H', 'U');
        mapping.put('I', 'V');
        mapping.put('J', 'W');
        mapping.put('K', 'X');
        mapping.put('L', 'Y');
        mapping.put('M', 'Z');
        mapping.put('N', 'A');
        mapping.put('O', 'B');
        mapping.put('P', 'C');
        mapping.put('Q', 'D');
        mapping.put('R', 'E');
        mapping.put('S', 'F');
        mapping.put('T', 'G');
        mapping.put('U', 'H');
        mapping.put('V', 'I');
        mapping.put('W', 'J');
        mapping.put('X', 'K');
        mapping.put('Y', 'L');
        mapping.put('Z', 'M');
        mapping.put('a', 'n');
        mapping.put('b', 'o');
        mapping.put('c', 'p');
        mapping.put('d', 'q');
        mapping.put('e', 'r');
        mapping.put('f', 's');
        mapping.put('g', 't');
        mapping.put('h', 'u');
        mapping.put('i', 'v');
        mapping.put('j', 'w');
        mapping.put('k', 'x');
        mapping.put('l', 'y');
        mapping.put('m', 'z');
        mapping.put('n', 'a');
        mapping.put('o', 'b');
        mapping.put('p', 'c');
        mapping.put('q', 'd');
        mapping.put('r', 'e');
        mapping.put('s', 'f');
        mapping.put('t', 'g');
        mapping.put('u', 'h');
        mapping.put('v', 'i');
        mapping.put('w', 'j');
        mapping.put('x', 'k');
        mapping.put('y', 'l');
        mapping.put('z', 'm');

        mask.add('a');
        mask.add('h');
    }
}

Здесь является реализацией шифра Цезаря (адаптировано из this Ruby пример ).

import java.util.*;

public class EncryptionUtil {
    private static final Set<Character> MASK;

    static {
        MASK = new HashSet<Character>(Arrays.asList('a', 'h'));
    }

    public static void main(String[] args) {
        String phrase = "action >> hello world";
        System.out.println(phrase);

        String encrypted = caesarCipher(phrase, 13, MASK);
        System.out.println(encrypted);

        String plaintext = caesarCipher(encrypted, 13, MASK);
        System.out.println(plaintext);
    }

    private static String caesarCipher(String plaintext, int shift, Set<Character> mask) {
        StringBuffer buff = new StringBuffer();
        for (char ch : plaintext.toCharArray()) {
            if (!mask.contains(ch) && Character.isAlphabetic(ch)) {
                int baseOrd = (int) (ch >= 'a' ? 'a' : 'A');
                int origPos = ((int) ch) - baseOrd;
                int newPos = (origPos + shift) % 26;
                buff.append((char) (baseOrd + newPos));
            } else {
                buff.append(ch);
            }
        }
        return buff.toString();
    }

    private static String caesarCipher(String plaintext, int shift) {
        return caesarCipher(plaintext, shift, Collections.<Character>emptySet());
    }
}

Вывод:

action >> hello world
apgvba >> hryyb jbeyq
actioa >> hello world
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...