The caesar cipher is one of the most widely-known and simple ciphers in classical cryptography.
Algorithm
The cipher is a simple monoalphabetic substitution. The substitution alphabet is the normal alphabet, rotated by N positions. For example; the 6-letter alphabet ABCDEF
would become CDEFAB
with a rotation of 2 positions.
Keyspace
As the only parameter to the cipher, the shift amount N serves as the key. There can only be K - 1
different keys for an alphabet of K
elements, as shifting by 0
or K
is the same as not shifting at all.
Similarly, any key below 0
or above K
has an identical key between 1
and K - 1
This makes the keyspace extremely small and trivial to brute force.
Python implementation
def text_to_numbers(text): return [ord(c) - ord("A") for c in text] text_to_numbers("ABCD") text_to_numbers("HELLO")
[0, 1, 2, 3]
[7, 4, 11, 11, 14]
def numbers_to_text(numbers): return "".join(chr(n + ord("A")) for n in numbers) numbers_to_text([0, 1, 2, 3]) numbers_to_text([7, 4, 11, 11, 14])
'ABCD'
'HELLO'
def encrypt(text, key): numbers = text_to_numbers(text) for i, n in enumerate(numbers): numbers[i] = (n + key) % 26 return numbers_to_text(numbers) encrypt("TESTMESSAGE", 5)
'YJXYRJXXFLJ'
def decrypt(text, key): numbers = text_to_numbers(text) for i, n in enumerate(numbers): numbers[i] = (n - key) % 26 return numbers_to_text(numbers) decrypt("YJXYRJXXFLJ", 5)
'TESTMESSAGE'
ROT13
The well-known ROT13 cipher is a special case of the Caesar cipher. The key is 13, which divides the alphabet in half.
Because of this, the encryption and decryption functions are identical.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
NOPQRSTUVWXYZABCDEFGHIJKLM
encrypt("SUPERSECRETMESSAGE", 13) encrypt("FHCREFRPERGZRFFNTR", 13)
'FHCREFRPERGZRFFNTR'
'SUPERSECRETMESSAGE'
We can also use the decryption function to encrypt with ROT13.
decrypt("SUPERSECRETMESSAGE", 13) decrypt("FHCREFRPERGZRFFNTR", 13)
'FHCREFRPERGZRFFNTR'
'SUPERSECRETMESSAGE'