#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;
}
Вам просто нужно иметь четкое представление о том, что вы делаете, чтобы правильно использовать индексы массива.