Cover by Toby Segaran, Jeff Hammerbacher

Safari, the world’s most comprehensive technology and business learning platform.

Find the exact information you need to solve a problem on the fly, or go deeper to master the technologies and skills you need to succeed

Start Free Trial

No credit card required

O'Reilly logo

Secret Codes

Our second challenge is to decode a message written in a secret code. We'll look at substitution ciphers, in which each letter is replaced by another. The description of what replaces what is called the key, which we can represent as a string of 26 letters; the first letter replaces "a", the second replaces "b", and so on. Here is the function to encode a message with a substitution cipher key (the Python library functions maketrans and translate do most of the work):

def encode(msg, key):
    "Encode a message with a substitution cipher."
    return msg.translate(string.maketrans(ul(alphabet), ul(key)))

def ul(text): return text.upper(  ) + text.lower(  )

alphabet = 'abcdefghijklmnopqrstuvwxyz'

Perhaps the simplest of all codes is the shift cipher, a substitution cipher in which each letter in the message is replaced by the letter n letters later in the alphabet. If n = 1, then "a" is replaced by "b" and "b" is replaced by "c", up to "z", which is replaced by "a". Shift ciphers are also called Caesar ciphers; they were state-of-the-art in 50 BC. The function shift encodes with a shift cipher:

def shift(msg, n=13):
    "Encode a message with a shift (Caesar) cipher."
    return encode(msg, alphabet[n:]+alphabet[:n])

We use the function like this:

>>> shift('Listen, do you want to know a secret?')
'Yvfgra, qb lbh jnag gb xabj n frperg?'

>>> shift('HAL 9000 xyz', 1)
'IBM 9000 yza'

To decode a message without knowing the key, we follow the same methodology we did with segmentations: define a ...

Find the exact information you need to solve a problem on the fly, or go deeper to master the technologies and skills you need to succeed

Start Free Trial

No credit card required