Столбчатая транспозиция Java-шифра

#java #encryption #transpose

Вопрос:

У меня не очень хорошо получается расшифровать зашифрованный текст.

 public class Practica2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("Enter a text: ");
        String txt = input.nextLine();
        System.out.println("Enter a num of columns: ");
        int num = input.nextInt();
        String cipher = cipherTrans(txt, num);
        System.out.println("Coded: "   cipher);
        String decipher = decipherTrans(cipher, num);
        System.out.println("Decoded: "   decipher);
    }

    //This method encrypts
    private static String cipherTrans(String txt, int num) {
        String output = "";
        //takes the length of the string and divides by the num of columns
        int num2 = (int) Math.ceil(txt.length()*1.0/num);
        //2d array 
        char[][] buffer = new char[num2][num];
        int k = 0;
        //loop which will store and rearrange the letter of the txt 
        for (int i = 0; i < num2; i  ) {
            for (int j = 0; j < num; j  , k  ) {
                if (txt.length() > k) {
                    buffer[i][j] = txt.charAt(k);
                }
            }
        }
    
        //loop which will store the rearrenged txt and output the encrypted txt
        for (int j = 0; j < num; j  ) {
            for (int i = 0; i < num2; i  ) {
                output  = buffer[i][j];
            }
        }
        return output;
    }

    //this method will decrypt the encrypted txt
    private static String decipherTrans(String txt, int num) {
        String output = "";
        int num2 = (int) Math.ceil(txt.length() * 1.0 / num);
        char[][] buffer = new char[num2][num];
        int k = 0;
        for (int i = 0; i < num2; i  ) {
            for (int j = 0; j < num; j  , k  ) {
                if (txt.length() > k) {
                    buffer[i][j] = txt.charAt(k);
                }
            }
        }
        for (int i = 0; i < num; i  ){
            for (int j = 0; j < num2; j  ){
                txt  = buffer[j][i];
            }
        }
        return output;
    }
}
 

ВЫХОДНОЙ ТОК:

 Enter a text: 

my name is dani

Enter a num of columns: 

5

Coded: mm yed  aninasi

Decoded: mdim n  ayaseni
 

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

 Enter a text: 

my name is dani

Enter a num of columns: 

5

Coded: mm yed  aninasi

Decoded: my name is dani
 

Комментарии:

1. Возможно, вы могли бы отредактировать свой вопрос, чтобы объяснить словами, как должна работать эта конкретная столбчатая транспозиция шифра?

Ответ №1:

Таблица транспозиции

Это ваш зашифрованный текст: mm yed aninasi ; длина ключа равна 5 .

Таблица транспозиции для вашего конкретного случая выглядит следующим образом:

 char[][] buffer = {
    {'m', 'y', ' ', 'n', 'a'},
    {'m', 'e', ' ', 'i', 's'},
    {' ', 'd', 'a', 'n', 'i'}
};
 

Как создать таблицу транспозиции?

«… получатель должен определить длину столбцов, разделив длину сообщения [зашифрованного текста] на длину ключа. Тогда они снова смогут записать сообщение в столбцах …»

От: https://en.wikipedia.org/wiki/Transposition_cipher#Columnar_transposition

Как расшифровать сообщение?

После того как вы создали таблицу транспозиции, просто прочитайте ее строку за строкой слева направо.

Решение

Рабочий метод расшифровки, основанный на вашем коде, может выглядеть следующим образом:

 private static String decipherTrans(String txt, int num) {
    int num2 = (int) Math.ceil(txt.length() * 1.0 / num);

    char[][] buffer = new char[num2][num];
    int k = 0;
    for (int i = 0; i < num; i  ) {
        for (int j = 0; j < num2; j  , k  ) {
            if (txt.length() > k) {
                buffer[j][i] = txt.charAt(k);
            }
        }
    }

    String output = "";
    for (int i = 0; i < num2; i  ){
        for (int j = 0; j < num; j  ){
            output  = buffer[i][j];
        }
    }
    return output;
}
 

Вам просто нужно иметь четкое представление о том, что вы делаете, чтобы правильно использовать индексы массива.