playfair
unknown
java
3 years ago
4.8 kB
4
Indexable
import java.util.Scanner; public class PlayFair { private static char[][] keyMatrix; // Initialize key matrix static { keyMatrix = new char[][]{ {'M', 'O', 'N', 'A', 'R'}, {'C', 'H', 'Y', 'B', 'D'}, {'E', 'F', 'G', 'I', 'K'}, {'L', 'P', 'Q', 'S', 'T'}, {'U', 'V', 'W', 'X', 'Z'} }; } // Encrypts the given message using the PlayFair algorithm and the key matrix public static String encrypt(String message) { // Remove spaces and non-alphabetic characters from the message message = message.replaceAll("[^A-Za-z]", ""); message = message.toUpperCase(); // Insert X between double letters StringBuilder sb = new StringBuilder(); for (int i = 0; i < message.length(); i++) { char c = message.charAt(i); sb.append(c); if (i < message.length() - 1 && c == message.charAt(i + 1)) { sb.append('X'); } } message = sb.toString(); // If the message has an odd length, append an X at the end if (message.length() % 2 == 1) { message += 'X'; } // Initialize the encrypted message String encryptedMessage = ""; // Encrypt the message in pairs of letters for (int i = 0; i < message.length(); i += 2) { char c1 = message.charAt(i); char c2 = message.charAt(i + 1); // Get the indices of the characters in the key matrix int[] index1 = getCharIndex(c1); int[] index2 = getCharIndex(c2); // Encrypt the pair of characters using the key matrix if (index1[0] == index2[0]) { // Same row - replace with characters to the right (wrapping around if necessary) encryptedMessage += keyMatrix[index1[0]][(index1[1] + 1) % 5]; encryptedMessage += keyMatrix[index2[0]][(index2[1] + 1) % 5]; } else if (index1[1] == index2[1]) { // Same column - replace with characters below (wrapping around if necessary) encryptedMessage += keyMatrix[(index1[0] + 1) % 5][index1[1]]; encryptedMessage += keyMatrix[(index2[0] + 1) % 5][index2[1]]; } else { // Different row and column - replace with characters in the same row, but in the columns of the other character encryptedMessage += keyMatrix[index1[0]][index2[1]]; encryptedMessage += keyMatrix[index2[0]][index1[1]]; } } return encryptedMessage; } // Decrypts the given encrypted message using the PlayFair algorithm and the key matrix public static String decrypt(String encryptedMessage) { // Initialize the decrypted message String decryptedMessage = ""; // Decrypt the message in pairs of letters for (int i = 0; i < encryptedMessage.length(); i += 2) { char c1 = encryptedMessage.charAt(i); char c2 = encryptedMessage.charAt(i + 1); // Get the indices of the characters in the key matrix int[] index1 = getCharIndex(c1); int[] index2 = getCharIndex(c2); // Decrypt the pair of characters using the key matrix if (index1[0] == index2[0]) { // Same row - replace with characters to the left (wrapping around if necessary) decryptedMessage += keyMatrix[index1[0]][(index1[1] + 4) % 5]; decryptedMessage += keyMatrix[index2[0]][(index2[1] + 4) % 5]; } else if (index1[1] == index2[1]) { // Same column - replace with characters above (wrapping around if necessary) decryptedMessage += keyMatrix[(index1[0] + 4) % 5][index1[1]]; decryptedMessage += keyMatrix[(index2[0] + 4) % 5][index2[1]]; } else { // Different row and column - replace with characters in the same row, but in the columns of the other character decryptedMessage += keyMatrix[index1[0]][index2[1]]; decryptedMessage += keyMatrix[index2[0]][index1[1]]; } } // Remove X characters that were inserted between double letters decryptedMessage = decryptedMessage.replace("X", ""); return decryptedMessage; } // Returns the indices (row and column) of the given character in the key matrix private static int[] getCharIndex(char c) { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (keyMatrix[i][j] == c) { return new int[]{i, j}; } } } return null; } }
Editor is loading...