
 One of the first “real” programs I ever wrote would encrypt a message
                    using a substitution cipher and (more impressively) decrypt an encoded message without knowing the
                    encryption key. Perhaps the first thing I had to come up with was an algorithm to take a cipher key
                    that was used to encode a message, and transform it so that it could then be used do decode the
                    ciphertext back into plaintext. I was aware of ROT-13’s property that if applied once to the
                    plaintext, and again to the output ciphertext, it would yield the original plaintext. That is,
                    ROT-13 is its own inverse. However, this is not the case for all possible keys, so I needed to find
                    a more general algorithm.