package ciphers; import java.util.*; /** * The simple substitution cipher is a cipher that has been in use for many hundreds of years (an * excellent history is given in Simon Singhs 'the Code Book'). It basically consists of * substituting every plaintext character for a different ciphertext character. It differs from the * Caesar cipher in that the cipher alphabet is not simply the alphabet shifted, it is completely * jumbled. * * @author Hassan Elseoudy */ public class SimpleSubstitutionCipher { /** * Encrypt text by replacing each element with its opposite character. * * @param message * @param cipherSmall * @return Encrypted message */ public static String encode(String message, String cipherSmall) { String encoded = ""; // This map is used to encode Map cipherMap = new HashMap(); char beginSmallLetter = 'a'; char beginCapitalLetter = 'A'; cipherSmall = cipherSmall.toLowerCase(); String cipherCapital = cipherSmall.toUpperCase(); // To handle Small and Capital letters for (int i = 0; i < cipherSmall.length(); i++) { cipherMap.put(beginSmallLetter++, cipherSmall.charAt(i)); cipherMap.put(beginCapitalLetter++, cipherCapital.charAt(i)); } for (int i = 0; i < message.length(); i++) { if (Character.isAlphabetic(message.charAt(i))) encoded += cipherMap.get(message.charAt(i)); else encoded += message.charAt(i); } return encoded; } /** * Decrypt message by replacing each element with its opposite character in cipher. * * @param encryptedMessage * @param cipherSmall * @return message */ public static String decode(String encryptedMessage, String cipherSmall) { String decoded = ""; Map cipherMap = new HashMap(); char beginSmallLetter = 'a'; char beginCapitalLetter = 'A'; cipherSmall = cipherSmall.toLowerCase(); String cipherCapital = cipherSmall.toUpperCase(); for (int i = 0; i < cipherSmall.length(); i++) { cipherMap.put(cipherSmall.charAt(i), beginSmallLetter++); cipherMap.put(cipherCapital.charAt(i), beginCapitalLetter++); } for (int i = 0; i < encryptedMessage.length(); i++) { if (Character.isAlphabetic(encryptedMessage.charAt(i))) decoded += cipherMap.get(encryptedMessage.charAt(i)); else decoded += encryptedMessage.charAt(i); } return decoded; } /** TODO remove main and make JUnit Testing */ public static void main(String[] args) { String a = encode("defend the east wall of the castle", "phqgiumeaylnofdxjkrcvstzwb"); String b = decode(a, "phqgiumeaylnofdxjkrcvstzwb"); System.out.println(b); } }