An ancient form of cryptography is to encrypt a message by "rotating" the alphabet forward by three places.

For example to encrypt a message `M = ATTACKATDAWN`

, each letter will be replaced by the letter that comes three places later.

That is, $A \to D, B \to E, C \to F,...,W \to A, X \to B, Z \to C$.

In the cells below, use Python to encrypt `M`

using the Caesar cipher.

In order to help, I have created a dictionary that might be useful.

In [2]:

# We can make a codebook for our Caesar cipher using a dictionary codebook = {'A':'D','B':'E','C':'F','D':'G','E':'H','F':'I','G':'J','H':'K','I':'L','J':'M','K':'N','L':'O','M':'P','N':'Q','O':'R','P':'S','Q':'T','R':'U','S':'V','T':'W','U':'X','V':'Y','W':'Z','X':'A','Y':'B','Z':'C'}

In [3]:

# Use the codebook to encrypt the following message. M = 'ATTACKATDAWN' C = '' for m in M: m_encrypted = codebook[m] C += m_encrypted C

'DWWDFNDWGDZQ'

In [ ]:

# Exercise: # Encrypt your own name using the Caesar cipher

In [3]:

# Write your solution here

Now define a function called `caesar_encrypt(M)`

which takes a message `M`

(assumed to be only uppercase Roman letters) and returns the ciphertext resulting from applying the Caesar cipher to `M`

In [4]:

# Please define the function here # Solution: def caesar_encrypt(M,codebook = codebook): C = '' for m in M: m_encrypted = codebook[m] C += m_encrypted return C #More generally the Caesar cipher is just a certain substitution cipher... def substitute(M,codebook): """ Every character in the string M is replaced with its encoding codebook[m] """ C = '' for m in M: m_encoded = codebook[m] C += m_encoded return C

In [5]:

caesar_encrypt(M) #This should encrypt M now that you've defined the function.

'DWWDFNDWGDZQ'

We will now make a new dictionary which is the *inverse* of the codebook and use it for decryption.

In the cell below, make a new dictionary `decodebook`

which decrypts your encryption of `M`

back to the original message.

In [6]:

# Write your decryption dictionary here. Try to define it using code, not by hand. decodebook = dict() #want decodebook[a]==b if and only if codebook[b] == a # because codebook['A']=='D', we want decodebook['D']=='A' #Strategy: iterate over codebook.items() make decodebook have the opposite entries # Solution: for key,value in codebook.items(): decodebook[value] = key decodebook.items()

dict_items([('D', 'A'), ('E', 'B'), ('F', 'C'), ('G', 'D'), ('H', 'E'), ('I', 'F'), ('J', 'G'), ('K', 'H'), ('L', 'I'), ('M', 'J'), ('N', 'K'), ('O', 'L'), ('P', 'M'), ('Q', 'N'), ('R', 'O'), ('S', 'P'), ('T', 'Q'), ('U', 'R'), ('V', 'S'), ('W', 'T'), ('X', 'U'), ('Y', 'V'), ('Z', 'W'), ('A', 'X'), ('B', 'Y'), ('C', 'Z')])

Your spies intercept the ciphertext message `C = 'PHHWDWWKHWRZHUEHIRUHOXQFK'`

, sent by Caesar.

What is the original message?

In [7]:

# Find the original message here. substitute(C,decodebook)

'ATTACKATDAWN'

In [9]:

C = 'PHHWDWWKHWRZHUEHIRUHOXQFK' substitute(C,decodebook)

'MEETATTHETOWERBEFORELUNCH'

In [ ]:

In [ ]: