Simple Substitution Cipher Algorithm
In cryptanalysis, a substitution cipher is a method of encryption by which units of plaintext are replaced with ciphertext, according to a fixed system; the" units" may be individual letters (the most common), pairs of letters, triplets of letters, mixtures of the above, and so forth. A monoalphabetic cipher uses fixed substitution over the entire message, whereas a polyalphabetic cipher uses a number of substitutions at different positions in the message, where a unit from the plaintext is mapped to one of several possibility in the ciphertext and vice versa.
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<Character,Character> cipherMap = new HashMap<Character,Character>();
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<Character,Character> cipherMap = new HashMap<Character,Character>();
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);
}
}