Question
Hello, I'm working on implementing an encrypting/decrypting cipher called the Transposition Cipher. Basically, the input has an operation ('E' for encrypt, 'D' for decrypt), a
Hello,
I'm working on implementing an encrypting/decrypting cipher called the Transposition Cipher. Basically, the input has an operation ('E' for encrypt, 'D' for decrypt), a key, and the message to be filled in a 2d array based on the alphabetical ordering of the key. The output is the encrypted/decrypted String. The empty spaces in the grid must be filled by '@' (this is where I'm having the most trouble as I'm not getting the desired output).
It works for the regular cases, but the '@'s aren't filling up the spaces properly when:
- the key has repeating characters and/or is longer than the plaintext (it's not getting encrypted/decrypted in the right way)
ex input: E COMPUTERSCIENCE HELLO WORLD
expected output: HD@O@@@L@ELRLWO
my output: HLOWORL@@E@D@L@
- the key is the same length as the plaintext
ex input: D COMPUTERSCIENCE HD@O@@@L@ELRLWO
expected output: HELLOWORLD@@@@@
my output: HEWD@O@@@ROL@LL
I've attached my code below.
Thank you so much!
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class TranspositionCipher { private String line; private String[] arr; private String oper; private String text; private String key; public TranspositionCipher(String line, String[] array, String oper, String text, String key) { this.line = line; this.arr = array; this.oper = oper; this.text = text; this.key = key; } public static String encryptCT(String key, String text) { int[] arrange = arrangeKey(key); int lenkey = arrange.length; int lentext = text.length(); int numRows; if (lenkey > lentext) { numRows = 1; } else { numRows = (int) Math.ceil((double) lentext / lenkey); } char[][] grid = new char[numRows][lenkey]; int z = 0; for (int x = 0; x < numRows; x++) { for (int y = 0; y < lenkey; y++) { if (z < lentext) { grid[x][y] = text.charAt(z); z++; } else { grid[x][y] = FillEmptySpace(); } } } String enc = ""; for (int x = 0; x < lenkey; x++) { for (int y = 0; y < lenkey; y++) { if (x == arrange[y]) { for (int a = 0; a < numRows; a++) { enc = enc + grid[a][y]; } } } } return enc; } public static String decryptCT(String key, String text) { int[] arrange = arrangeKey(key); int lenkey = arrange.length; int lentext = text.length(); int numRows; if (lenkey > lentext) { numRows = 1; } else { numRows = (int) Math.ceil((double) lentext / lenkey); } String regex = "(?<=\\G.{" + numRows + "})"; String[] get = text.split(regex); char[][] grid = new char[numRows][lenkey]; for (int x = 0; x < lenkey; x++) { for (int y = 0; y < lenkey; y++) { if (arrange[x] == y) { for (int z = 0; z < numRows; z++) { grid[z][y] = get[arrange[y]].charAt(z); } } } } String dec = ""; for (int x = 0; x < numRows; x++) { for (int y = 0; y < lenkey; y++) { dec = dec + grid[x][y]; } } return dec; } public static char FillEmptySpace() { return '@'; } public static int[] arrangeKey(String key) { String[] keys = key.split(""); Arrays.sort(keys); int[] num = new int[key.length()]; int count = 0; for (int i = 0; i < key.length(); i++) { for (int j = i + 1; j < key.length(); j++) { if (key.substring(i, i + 1).equals(key.substring(j, j + 1))) { count++; } } } if (count > 0) { ArrayList numList = new ArrayList<>(); for (int k = 0; k < key.length(); k++) { char c = key.charAt(k); for (int l = 0; l < key.length(); l++) { if (!numList.contains(l)) { if (key.charAt(l) == c) { numList.add(l); } } } } for (Integer i : numList) { num[i] = numList.get(i); } } else { for (int x = 0; x < keys.length; x++) { for (int y = 0; y < key.length(); y++) { if (keys[x].equals(key.charAt(y) + "")) { num[y] = x; break; } } } } return num; } public static void main(String[] args) throws FileNotFoundException { Scanner fileIn = new Scanner(new File("input.txt")); while (fileIn.hasNextLine()) { String line = fileIn.nextLine(); String[] arr = line.split(" "); String oper = arr[0]; String text = ""; for (int i = 2; i < arr.length; i++) { text += arr[i]; } String key = arr[1]; text = text.replaceAll("'", ""); TranspositionCipher crypt = new TranspositionCipher(line, arr, oper, text, key); if (crypt.oper.equals("E")) { System.out.println(encryptCT(key, text).toUpperCase()); } if (crypt.oper.equals("D")) { System.out.println(decryptCT(key, text).toUpperCase()); } } } }
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started