Неверное шифрование / дешифрование строки - PullRequest
0 голосов
/ 28 июня 2018

Я создал эту программу, чтобы принять String в качестве пользовательского ввода и заменить каждый символ слова другим конкретным символом, чтобы создать другое слово.

Но вывод такой же, как и вход.

import java.util.Scanner;

class Encrypt{

    public static void main(String[] args){

        char[] arrencrypt={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        char[] arrdecrypt={'Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A'};

        Scanner sc=new Scanner(System.in);
        System.out.println("Enter the encrypted word:");
        String word=sc.nextLine();
        char[] arr=word.toCharArray();
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arrencrypt.length;j++){
                if(arr[i]==arrencrypt[j]){
                    arr[i]=arrdecrypt[j];
                }
            }
        }
        for(int k=0;k<arr.length;k++){
            System.out.print(arr[k]);
        }
    }
}

Ответы [ 6 ]

0 голосов
/ 28 июня 2018

Попробуйте это решение: Сначала вы инициализируете свою карту, где ключом является зашифрованная буква, а значением является расшифрованная буква, затем вы предоставляете свое слово и программа заменяет буквы и выводит на печать. Инициализируйте карту, просто конвертируйте число ASCII в Char, а затем в String, чтобы поместить его в карту

public class Encrypt {

    public static void main(String[] args) {
       Map<Character, Character> map = initializeMap();
       StringBuilder output = new StringBuilder();
       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the encrypted word:");
       String word = sc.nextLine();

       for (char s : word.toCharArray()) {
          output.append(map.get(s));
       }

       System.out.println(output.toString());
   }

   private static Map<Character, Character> initializeMap() {
      Map<Character, Character> map = new HashMap<>();
      for (int i = 65; i <= 90; i++) {
         map.put((char) i, (char) (155 - i));
      }
      for (int i = 97; i <= 122; i++) {
         map.put((char) i, (char) (219 - i));
      }

    return map;
}
0 голосов
/ 28 июня 2018

Проблема во внутреннем цикле.

for(int j=0;j<arrencrypt.length;j++){
    if(arr[i]==arrencrypt[j]){
        arr[i]=arrdecrypt[j];
    }
}

Это работает для входных данных, которые находятся во второй половине алфавита. Но когда буква найдена в первой половине алфавита, сначала она заменяется, затем цикл продолжает идти, находит новую букву и заменяет ее оригинальной буквой. (A заменяется на Z, но затем Z обнаруживается в более поздней итерации цикла и заменяется на A.)

Добавьте разрыв, чтобы выйти из этого цикла после одной замены.

for(int j=0;j<arrencrypt.length;j++){
    if(arr[i]==arrencrypt[j]){
        arr[i]=arrdecrypt[j];
        break;
    }
}
0 голосов
/ 28 июня 2018

попробуйте

import java.util.Scanner;

public class A {
    public static void main(String[] args) {
        char[] arrencrypt = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
                'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
        char[] arrdecrypt = { 'Z', 'Y', 'X', 'W', 'V', 'U', 'T', 'S', 'R', 'Q', 'P', 'O', 'N', 'M', 'L', 'K', 'J', 'I',
                'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A' };
        try (Scanner sc = new Scanner(System.in)) {
            System.out.println("Enter the encrypted word:");
            String word = sc.nextLine();
            char[] arr = word.toCharArray();
            for (int i = 0; i < arr.length; i++) {
                char ch = arr[i];
                if (ch >= 'A' && ch <= 'Z') {
                    for (int j = 0; j < arrencrypt.length; j++) {
                        if (arrencrypt[j] == arr[i]) {
                            arr[i] = arrdecrypt[j];
                            break;
                        }
                    }
                } else {
                    char temp = Character.toUpperCase(arr[i]);
                    for (int j = 0; j < arrencrypt.length; j++) {
                        if (arrencrypt[j] == temp) {
                            arr[i] = Character.toLowerCase(arrdecrypt[j]);
                            break;
                        }
                    }
                }
            }
            for (char ch : arr)
                System.out.print(ch);
        }
    }
}

Выход

Enter the encrypted word:
Hello
Svool

, поскольку у вас есть только заглавные буквы, поэтому он не работает

0 голосов
/ 28 июня 2018

Полученный массив является дубликатом внутреннего массива char строки, поэтому изменение массива не изменит строку. Это действительно благословение.

    char[] arr = word.toCharArray();
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arrencrypt.length; j++){
            if (arr[i] == arrencrypt[j]) {
                arr[i] = arrdecrypt[j];
                break;
            } else if (arr[i] == Character.toLowerCase(arrencrypt[j])) {
                arr[i] = Character.toLowerCase(arrdecrypt[j]);
                break;
            }
        }
    }
    String word2 = new String(arr);
    System.out.printf("Word '%s' is decrypted as: '%s'%n", word, word2);
    for(int k=0;k<arr.length;k++){
        System.out.print(arr[k]);
    }

Без перерыва условие может стать истинным с измененным символом на более поздний период j. И тогда это преобразуется снова. К сожалению, здесь двойное шифрование дает исходное письмо.


С другой стороны

    String arrencrypt = "ABCDEFG...XYZ";
    String arrdecrypt = "ZYX...GFEDCBA";
    StringBuilder sb = new StringBuilder(word.length());
    for (int i = 0; i < word.length(); i++) {
        char ch = word.charAt(i);
        int j = arrencrypt.indexOf(ch);
        if (j != -1) {
            ch = arrdecrypt.charAt(j);
        }
        sb.append(ch);
    }
    String word2 = sb.toString();
0 голосов
/ 28 июня 2018

Вы можете сделать свою жизнь намного проще, если будете использовать простую арифметику персонажей. Это исключает объявление двух массивов и их итерацию полностью:

for(int i = 0; i < arr.length; i++){
    char c = arr[i];
    if(Character.isLowerCase(c)){
        arr[i] = (char) ('z' - c + 'a');
    } else if(Character.isUpperCase(c)){
        arr[i] = (char) ('Z' - c + 'A');
    }
}

Этот код поменяет местами каждую букву в алфавите со своим "аналогом". Например. 'Z' будет зашифровано до 'A' и так далее. Я также добавил ту же логику для поддержки строчных букв.

«Математика» за этим довольно проста. Он работает путем преобразования char в его ASCII-значение. Это делается неявно в Java. Смотрите пример:

int i = 'A';
System.out.println(i);

Будет печатать 65, поскольку значение ASCII A равно 65.

0 голосов
/ 28 июня 2018

Из-за этого в ваших arrencrypt и arrdecrypt все chars прописные. Это означает, что будут заменены только заглавные буквы. Так что либо меняй

char[] arr=word.toCharArray();

К

char[] arr=word.toUpperCase().toCharArray();

Или введите chars строчные буквы в вашем arrays

С этим изменением:

Input: "String"

Output: "HGIRMT"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...