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()); } } } }

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Here is the original problem, but it only discusses the regular cases (which already work for me). My main problem is incorporating the '@'s into the empty spaces in the 2d grid so that they show up in the output String.

Part 3 As you can see creating and breaking ciphers is intriguing, so much so that we have ask you to encode and decode various messages. For this cryptology endeavor we will use Simple Transposition Cipher. Please refer back to the previous handout if need be. Input: All data will be read from a file. The first item to be read is a letter representing E for encrypt or D for decrypt, followed by a String representing the keyword, then another String that is to be either encrypted or decrypted. There will be an undisclosed number of items to be either encrypted or decrypted. Output: The encrypted or decrypted message Test data E MATH MY MOTHER IS PRETTY D BREAD KUTOOTYDETENHNRESRROHIEFD E FOLKS DEAD PEOPLE CAN'T TALK TO FOLKS D CRY CLOAUOLSN Test Output YHSTORRYMTIEMEPT THEKEYISUNDERTHEFRONTDOOR DECAFDLTTKAPNKLEOALOPETOS CALLUSOON

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!