Melo_JP Ответов: 3

Замените буквы шифрованного текста английскими буквами в зависимости от частоты


Цель состоит в том, чтобы вычислить частоту букв зашифрованного текста, а затем заменить их английскими буквами на основе их статистики частоты.

Что я уже пробовал:

Я сгенерировал частоты, но когда я использую метод replace, он не дает желаемого результата, например, если я использую один метод replace (), он выводит соответственно(
String A = encryptedText.replace('a','z');
. Он заменяет все " а " на "Я", но если я добавлю методы замены(например, один метод замены для каждого символа алфавита
(<pre>  String B = encryptedText.replace('b','y');
,
(<pre>  String C = encryptedText.replace('c','x');
) и так далее выполняется только первый метод replace function, остальные не выполняются, и он удваивает все буквы в выводе, например, если я заменяю "a", " b " и " c " на "z", " y " и " x " соответственно, он выводит как "
zbcaycabxabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc
".

Ниже приведен мой код:

import java.util.Arrays;
import java.util.Scanner;

public class FrequencyAnalysisCaesarCipher {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.println("Please enter message to be decrypted: ");
        String encryptedText = input.nextLine().toLowerCase();

        int[] freq = new int[encryptedText.length()];
        int i = 0;
        int j;

        //Converts given string into character array
        char[] string = encryptedText.toCharArray();
        Arrays.sort(string);
        Arrays.sort(new int[]{freq[i]});

        for (i = 0; i < encryptedText.length(); i++) {
            freq[i] = 1 ;
            for (j = i + 1; j < encryptedText.length(); j++) {
                if (string[i] == string[j]) {
                    freq[i]++;

                    //Set string[j] to 0 to avoid printing visited character
                    string[j] = '0';

                }
            }
        }

        //Displays each character and their corresponding frequency
        System.out.println("Characters and their corresponding frequencies");
        for (i = 0; i < freq.length; i++) {
            if (string[i] != ' ' && string[i] != '0') {
                System.out.println(string[i] + "-" + freq[i]);
            }
        }
        System.out.println("..............................................");

        // oldChar is cipher text letter and newChar is English letter
        // The newChar have been initiated just so to run the program but can be replaced accordingly based on frequency and then re-run to give the desired output

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

        System.out.print(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);


    }
}

3 Ответов

Рейтинг:
2

MadMyche

Цель
Цель состоит в том, чтобы вычислить частоту букв зашифрованного текста, а затем заменить их английскими буквами на основе их статистики частоты.
Вы полностью на неверном пути для этого задания; все, что вы делаете, это заменяете буквы другими буквами, и вы также испортили это.

Первой частью этой задачи будет определение статистики частоты каждого символа, появляющегося в предоставленной строке. Думайте об этом как о таблице данных, которая выглядит следующим образом
Chr Cnt
 a   14
 b   3
 c   7
 d   11

and so on...
И как только это будет сделано, вы можете отсортировать эту таблицу на основе подсчета и сделать свои замены на основе этого порядка.


Рейтинг:
1

Patrice T

Цитата:
когда я использую метод замены он не дает желаемого результата

Для шифрования и дешифрования вы должны построить свою собственную функцию замены.
Я не знаю Java, но вот принцип:
Вместо того чтобы делать 1 замену в то время на всей строке, вы должны обрабатывать 1 символ в то время и делать правильную замену на нем.
Вот принцип в псевдокоде:
// get message
msg= " My message to code"
// define the key
Key="zyxwvutsrqponmlkjihgfedcba"
// loop on message
for i=0 to msg.length-1
    // get nth char
    tmp= msg[i]
    // check if lowercase letter
    if tmp is lowercase letter
        // convert to position in key
        pos= tmp- 'a'
        // replace
        msg[i]= key[pos]
    endif
next
// message is encrypted
return msg


Рейтинг:
0

Richard MacCutchan

Первая строка замены (A) должна быть входом для следующего вызова:

        String A = encryptedText.replace('a','z');
        String B = A.replace('b','y');
        String C = B.replace('c','x');
// etc .

Последняя строка должна содержать все замены.


Richard Deeming

Конечно, это не сработает так, как было задумано?

encryptedText
    .replace('a', 'z')
    ...
    .replace('z', 'a')

Вы в конечном итоге замените n..z, но оставь a..m нетронутый.

Richard MacCutchan

Дох!

Richard MacCutchan

Дох!