Почему моя дешифрование в шифре матрицы с коллапсом производит неправильный открытый текст?JAVA

Программисты JAVA общаются здесь
Anonymous
Почему моя дешифрование в шифре матрицы с коллапсом производит неправильный открытый текст?

Сообщение Anonymous »

Введите Описание изображения здесь
I реализовал дешифтировку шифровки матрицы с коллапсом в коде Java.
Спецификация шифра
Инициализация сетки

rr. /> < /li>
Заполняйте его уникальными буквами ключевого слова (игнорируйте неалфавитные символы), за которыми следуют оставшиеся буквы алфавита. пропустить J во время создания сетки. При расшифровке I и J взаимозаменяемы. P IS AT (ROW+1, COL) (обертка вокруг SO ROW 4 становится строкой 0). < /P>
< /li>
< /ul>
Шаг коллапса < /p>

После поиска p, удалить его из сетки. (слева направо, верхняя к дну) вперед на один, чтобы заполнить разрыв. дешифрование. Я был бы очень признателен за любые советы, предложения или решения, которые у вас могут иметь по этому вопросу. Я сталкиваюсь с проблемами, когда вывод не соответствует ожидаемому открытому тексту. В Ciphertext используется динамическая сетка, которая обрушивается после обработки каждого символа, и я следовал алгоритму дешифрования, но все же получаю неверные результаты. < /P>
Проблема: < /p>

Процесс расшифровки не дает правильного результата. Сетка сетки или смещение после каждого дешифрования не функционирует, как ожидалось, поэтому я получаю неверные результаты.2

crypto
kcnarfm
< /code>
ожидаемый выход 1 < /p>
hackathon
< /code>
Пример ввода 2 < /h3>
1

the quick brown fox
bmdzgrpre
< /code>
ожидаемый выход 2 < /p>
iamlegend
< /code>
Но я выхожу: < /p>
Фактический выход 1 < /p>
soxgbm
< /code>
Фактический вывод 2 < /p>
fzsyaqdb
< /code>
Вот код, который я написал: < /p>
import java.util.*;
import java.io.*;

public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
if (line == null) return;

int T = Integer.parseInt(line.trim());
for (int tc = 0; tc < T; tc++) {
// Skip blank lines before keyword
while ((line = br.readLine()) != null && line.trim().isEmpty());
if (line == null) break;
String keyword = line.trim();

// Skip blank lines before ciphertext
while ((line = br.readLine()) != null && line.trim().isEmpty());
if (line == null) break;
String ciphertext = line.trim();

// Decrypt & output
System.out.println(decrypt(keyword, ciphertext));

// Blank line between outputs
if (tc < T - 1) {
System.out.println();
}
}
}

private static String decrypt(String keyword, String ciphertext) {
// Build grid
boolean[] used = new boolean[26];
List grid = new ArrayList();

for (char ch : keyword.toCharArray()) {
if (!Character.isLetter(ch)) continue;
char c = Character.toLowerCase(ch);
if (c == 'j') c = 'i';
if (!used[c - 'a']) {
used[c - 'a'] = true;
grid.add(c);
}
}

for (char c = 'a'; c (row+1,col)
// Then decryption should be (row,col) -> (row-1,col)

int cols = 5;
int rows = (grid.size() + cols - 1) / cols;
int cipherRow = cipherPos / cols;
int cipherCol = cipherPos % cols;

// Try going UP one row (reverse of going down)
int plainRow = (cipherRow - 1 + rows) % rows;
int plainPos = plainRow * cols + cipherCol;

if (plainPos >= grid.size()) {
plainPos = plainPos % grid.size();
}

char plainChar = grid.get(plainPos);
result.append(plainChar);
grid.remove(plainPos);
}

return result.toString();
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -plaintext

Вернуться в «JAVA»