X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=szyfrow%2Fcaesar.py;h=910ada2f456639160adad6ec4cbf3ad4e08ae567;hb=refs%2Fheads%2Fmain;hp=fbfe05086ec85e492f07ef5b4b1d665d0c75a55c;hpb=27c8005f6dea0026887b80a01b5f93a8f1b3c2b2;p=szyfrow.git diff --git a/szyfrow/caesar.py b/szyfrow/caesar.py index fbfe050..910ada2 100644 --- a/szyfrow/caesar.py +++ b/szyfrow/caesar.py @@ -1,8 +1,20 @@ +"""Enciphering and deciphering using the [Caesar cipher](https://en.wikipedia.org/wiki/Caesar_cipher). +Also attempts to break messages that use a Caesar cipher. + +The Caesar cipher operates one letter at a time. It converts each letter to a +number, then enciphers that number by adding the key. The result is taken mod +26 and converted back into a letter. + +""" + from szyfrow.support.utilities import * from szyfrow.support.language_models import * def caesar_encipher_letter(accented_letter, shift): - """Encipher a letter, given a shift amount + """Encipher a letter, given a shift amount. + + Accented version of latin letters (such as é and ö) are converted to their + non-accented versions before encryption. >>> caesar_encipher_letter('a', 1) 'b' @@ -91,6 +103,9 @@ def caesar_decipher(message, shift): def caesar_break(message, fitness=Pletters): """Breaks a Caesar cipher using frequency analysis + It tries all possible keys, scores the fitness of the text decipherd with + each key, and returns the key that produces the most fit deciphered text. + >>> caesar_break('ibxcsyorsaqcheyklxivoexlevmrimwxsfiqevvmihrsasrxliwyrh' \ 'ecjsppsamrkwleppfmergefifvmhixscsymjcsyqeoixlm') # doctest: +ELLIPSIS (4, -130.849989015...)