hcrypto.engines
Class PolySubstitutionKey

java.lang.Object
  |
  +--hcrypto.cipher.HistoricalKey
        |
        +--hcrypto.engines.PolySubstitutionKey

public class PolySubstitutionKey
extends HistoricalKey

This class represents a key for a PolySubstitution cipher (which many authors call a Homophonic Substitution). The key is entirely represented by a keyword, which is inserted at the beginning of the decoding alphabet. More precisely, the cipher alphabet is likely to be considerably larger than the plaintext alphabet with certain plaintext characters mapped into several different ciphertext characters, that is, the encryption mapping is one-to-many. On the other hand, each ciphertext character represents a unique plaintext character. The keyword will be expanded to a string with length equal to the size of the cipher alphabet with all characters in the plaintext alphabet. The kth character of the cipher alphabet will be decoded into the kth character of the keyword. This map also uniquely determines the set of characters that each plaintext character can be mapped into.

The keyword provided by the user is expanded to length equal to the size of the cipher alphabet in the following manner. First a string is created of all plaintext characters not in the keyword and this string is added to the end of the keyword. If this would create a keyword longer than the size of the cipher alphabet, the keyword is truncated before adding the missing plaintext characters. On the other hand, if the keyword plus missing characters creates a new keyword with length less than the size of the cipher alphabet, copies of the new keyword are added to itself till it is longer than the size of the cipher alphabet before it is truncated to be exactly of length equal to the size of the cipher alphabet.

For example, suppose that the plaintext alphabet is a..z of size 26 and the cipher alphabet is a..zA..Z of size 52. Suppose the user chooses the keyword: "nowisthetimetolearncryptography" of length 31. The 10 characters "bdfjkquvxz" are not contained in this keyword so add them to the end of it. Now add the first 11 characters of the resulting keyword to the end of itself to get a new keyword of length 52. Thus we have the following table for decoding:

 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ  -- The cipher alphabet
 nowisthetimetolearncryptographybdfjkquvxznowisthetim  -- The decoding alphabet
 
Thus for encryption, for example, "a" can be mapped into "q" or "B" and "t" can be mapped into any of the letters of "fimxUX" The PolySubstution cipher is one that requires that two different alphabets be used for the plaintext and ciphertext alphabets respectively. As just explained, the ciphertext alphabet must be larger than the plaintext alphabet. The following code segment provides an example of how to create and use a Polysubstitution cipher:
      Cipher cipher = Cipher.getInstance("PolySubstitution");
      HistoricalKey key = HistoricalKey.getInstance("PolySubstitution", cipher.getProvider());
      key.init("nowisthetimetolearncryptography/az/azAZ");
      cipher.init(key);
      String c1encrypt = cipher.encrypt("this is a secret message");
 
In this case, the plaintext alphabet consists of the letters a..z, and the ciphertext alphabet consists of the letters a..zA..Z. The decoding alphabet would be constructed from the keyphrase as described above.

See also:


PolySubstitutionEngine
Alphabet


Field Summary
static java.lang.String DEFAULT_KEY_DESCRIPTOR_PROMPT_STRING
          A keyword description.
static java.lang.String DEFAULT_KEYWORD_STRING
          A default keyword.
 
Fields inherited from class hcrypto.cipher.HistoricalKey
alphabet, blocksize, ciphAlphabet, cipherAlphabet, keyDescriptorPrompt, keyspec, keyword, plainAlphabet
 
Constructor Summary
PolySubstitutionKey()
           
 
Method Summary
 java.lang.String getAlgorithm()
          Returns the algorithm name "PolySubstitution".
 java.lang.String[] getCodingAlphabet()
          Returns the plaintext alphabet.
 char[] getDecodingAlphabet()
          Returns the decoding alphabet.
 void init(java.lang.String keyspec)
          Creates a PolySubstitutionKey with the specified keyspec.
protected  void initAlphabets()
          PRIVATE UTILITY METHODS
 void printAlphabets()
          Prints both the cipher and plain alphabets to the System console.
 
Methods inherited from class hcrypto.cipher.HistoricalKey
getAlphabet, getBlocksize, getCiphAlphabet, getCTAlphabet, getInstance, getKeyDescriptorPrompt, getKeyword, getPlainAlphabet, initKey, removeDuplicateChars
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_KEY_DESCRIPTOR_PROMPT_STRING

public static final java.lang.String DEFAULT_KEY_DESCRIPTOR_PROMPT_STRING
A keyword description.

DEFAULT_KEYWORD_STRING

public static final java.lang.String DEFAULT_KEYWORD_STRING
A default keyword.
Constructor Detail

PolySubstitutionKey

public PolySubstitutionKey()
Method Detail

init

public void init(java.lang.String keyspec)
          throws java.lang.Exception
Creates a PolySubstitutionKey with the specified keyspec.
Overrides:
init in class HistoricalKey
Parameters:
keySpec - takes the form "keyword/alphabet/cipheralphabet", i.e. "nowisthetimetolearncryptography/az/azAZ" for example, which would be mapped into the instance variables keyword as a String with the value of "nowisthetimetolearncryptography", alphabet as a String with the value "az" and and cipheralphabet as a String with the value "azAZ".

getAlgorithm

public java.lang.String getAlgorithm()
Returns the algorithm name "PolySubstitution".
Overrides:
getAlgorithm in class HistoricalKey

getDecodingAlphabet

public char[] getDecodingAlphabet()
Returns the decoding alphabet.

getCodingAlphabet

public java.lang.String[] getCodingAlphabet()
Returns the plaintext alphabet.

initAlphabets

protected void initAlphabets()
                      throws java.lang.Exception
PRIVATE UTILITY METHODS
Overrides:
initAlphabets in class HistoricalKey

printAlphabets

public void printAlphabets()
Prints both the cipher and plain alphabets to the System console.
Overrides:
printAlphabets in class HistoricalKey