6.1. Brute Force#

When a cipher method does not have many keys, it may be feasible to try all possible keys and visually inspect the results for a possible plaintext. Your definition of “not many keys” may change if you were doing this by hand or with a computer. Trying all \(26\) possible keys of the Caesar cipher by hand would be possible but tedious for a single person to undertake. Trying all 312 possible keys for the Affine cipher less so. The process of trying all possible keys for a given system is called a Brute Force method. It’s not efficient but it is guaranteed to reveal the plaintext message eventually. This is where the computer can really take care of the tedious work for us. We’ll encounter other cipher methods later on that can thwart a brute force method.

Brute Forcing the Caesar Cipher#

Suppose you intercepted the ciphertext:

PMOLO HKHUF AOPUN JVUMP KLUAP HSAVZ HFOLD YVALP APUJP WOLYA OHAPZ IFZVJ OHUNP UNAOL VYKLY VMAOL SLAAL YZVMA OLHSW OHILA AOHAU VAHDV YKJVB SKILT HKLVB A

We’ll use the previously written text_clean() and caesar() functions to try all \(26\) possible keys and generate 26 candidates for our plaintext.

ciphertext = 'PMOLO HKHUF AOPUN JVUMP KLUAP HSAVZ HFOLD YVALP APUJP WOLYA OHAPZ IFZVJ OHUNP UNAOL VYKLY VMAOL SLAAL YZVMA OLHSW OHILA AOHAU VAHDV YKJVB SKILT HKLVB A'

for testkey in range(0,26):
    print( 'Key', testkey, caesar(ciphertext, testkey, encipher = False) )
Key 0 pmolohkhufaopunjvumpkluaphsavzhfoldyvalpapujpwolyaohapzifzvjohunpunaolvyklyvmaolslaalyzvmaolhswohilaaohauvahdvykjvbskilthklvba
Key 1 olnkngjgteznotmiutlojktzogrzuygenkcxuzkozotiovnkxzngzoyheyuingtmotmznkuxjkxulznkrkzzkxyulznkgrvnghkzzngztuzgcuxjiuarjhksgjkuaz
Key 2 nkmjmfifsdymnslhtsknijsynfqytxfdmjbwtyjnynshnumjwymfynxgdxthmfslnslymjtwijwtkymjqjyyjwxtkymjfqumfgjyymfystyfbtwihtzqigjrfijtzy
Key 3 mjlilehercxlmrkgsrjmhirxmepxswecliavsximxmrgmtlivxlexmwfcwsglerkmrkxlisvhivsjxlipixxivwsjxlieptlefixxlexrsxeasvhgsyphfiqehisyx
Key 4 likhkdgdqbwklqjfrqilghqwldowrvdbkhzurwhlwlqflskhuwkdwlvebvrfkdqjlqjwkhrughuriwkhohwwhuvriwkhdoskdehwwkdwqrwdzrugfrxogehpdghrxw
Key 5 khjgjcfcpavjkpieqphkfgpvkcnvqucajgytqvgkvkpekrjgtvjcvkudauqejcpikpivjgqtfgtqhvjgngvvgtuqhvjgcnrjcdgvvjcvpqvcyqtfeqwnfdgocfgqwv
Key 6 jgifibebozuijohdpogjefoujbmuptbzifxspufjujodjqifsuibujtcztpdibohjohuifpsefspguifmfuufstpguifbmqibcfuuibuopubxpsedpvmecfnbefpvu
Key 7 ifhehadanythingconfidentialtosayhewroteitincipherthatisbysochangingtheorderofthelettersofthealphabetthatnotawordcouldbemadeout
Key 8 hegdgzczmxsghmfbnmehcdmshzksnrzxgdvqnsdhshmbhogdqsgzshraxrnbgzmfhmfsgdnqcdqnesgdkdssdqrnesgdzkogzadssgzsmnszvnqcbntkcadlzcdnts
Key 9 gdfcfybylwrfgleamldgbclrgyjrmqywfcupmrcgrglagnfcprfyrgqzwqmafyleglerfcmpbcpmdrfcjcrrcpqmdrfcyjnfyzcrrfyrlmryumpbamsjbzckybcmsr
Key 10 fcebexaxkvqefkdzlkcfabkqfxiqlpxvebtolqbfqfkzfmeboqexqfpyvplzexkdfkdqebloabolcqebibqqboplcqebximexybqqexqklqxtloazlriaybjxablrq
Key 11 ebdadwzwjupdejcykjbezajpewhpkowudasnkpaepejyeldanpdwpeoxuokydwjcejcpdaknzankbpdahappanokbpdawhldwxappdwpjkpwsknzykqhzxaiwzakqp
Key 12 daczcvyvitocdibxjiadyziodvgojnvtczrmjozdodixdkczmocvodnwtnjxcvibdiboczjmyzmjaoczgzoozmnjaoczvgkcvwzoocvoijovrjmyxjpgywzhvyzjpo
Key 13 czbybuxuhsnbchawihzcxyhncufnimusbyqlinycnchwcjbylnbuncmvsmiwbuhachanbyilxyliznbyfynnylmiznbyufjbuvynnbunhinuqilxwiofxvyguxyion
Key 14 byaxatwtgrmabgzvhgybwxgmbtemhltraxpkhmxbmbgvbiaxkmatmblurlhvatgzbgzmaxhkwxkhymaxexmmxklhymaxteiatuxmmatmghmtphkwvhnewuxftwxhnm
Key 15 axzwzsvsfqlzafyugfxavwflasdlgksqzwojglwalafuahzwjlzslaktqkguzsfyafylzwgjvwjgxlzwdwllwjkgxlzwsdhzstwllzslfglsogjvugmdvtwesvwgml
Key 16 zwyvyrurepkyzextfewzuvekzrckfjrpyvnifkvzkzetzgyvikyrkzjspjftyrexzexkyvfiuvifwkyvcvkkvijfwkyvrcgyrsvkkyrkefkrnfiutflcusvdruvflk
Key 17 yvxuxqtqdojxydwsedvytudjyqbjeiqoxumhejuyjydsyfxuhjxqjyiroiesxqdwydwjxuehtuhevjxubujjuhievjxuqbfxqrujjxqjdejqmehtsekbtrucqtuekj
Key 18 xuwtwpspcniwxcvrdcuxstcixpaidhpnwtlgditxixcrxewtgiwpixhqnhdrwpcvxcviwtdgstgduiwtatiitghduiwtpaewpqtiiwpicdipldgsrdjasqtbpstdji
Key 19 wtvsvorobmhvwbuqcbtwrsbhwozhcgomvskfchswhwbqwdvsfhvohwgpmgcqvobuwbuhvscfrsfcthvszshhsfgcthvsozdvopshhvohbchokcfrqcizrpsaorscih
Key 20 vsurunqnalguvatpbasvqragvnygbfnlurjebgrvgvapvcuregungvfolfbpunatvatgurbeqrebsguryrggrefbsgurnycunorggungabgnjbeqpbhyqorznqrbhg
Key 21 urtqtmpmzkftuzsoazrupqzfumxfaemktqidafqufuzoubtqdftmfuenkeaotmzsuzsftqadpqdarftqxqffqdearftqmxbtmnqfftmfzafmiadpoagxpnqympqagf
Key 22 tqspslolyjestyrnzyqtopyetlwezdljsphczeptetyntaspcesletdmjdznslyrtyrespzcopczqespwpeepcdzqesplwaslmpeesleyzelhzconzfwompxlopzfe
Key 23 sprorknkxidrsxqmyxpsnoxdskvdyckirogbydosdsxmszrobdrkdsclicymrkxqsxqdroybnobypdrovoddobcypdrokvzrkloddrkdxydkgybnmyevnlowknoyed
Key 24 roqnqjmjwhcqrwplxwormnwcrjucxbjhqnfaxcnrcrwlryqnacqjcrbkhbxlqjwprwpcqnxamnaxocqnunccnabxocqnjuyqjknccqjcwxcjfxamlxdumknvjmnxdc
Key 25 qnpmpilivgbpqvokwvnqlmvbqitbwaigpmezwbmqbqvkqxpmzbpibqajgawkpivoqvobpmwzlmzwnbpmtmbbmzawnbpmitxpijmbbpibvwbiewzlkwctljmuilmwcb

Looking through the output, there’s a lot of junk text but your eye may be drawn to the line for key value of 7 since it contains some words that are clearly English. After some spacing it wouldn’t be hard to see it states,

“If he had anything confidential to say, he wrote it in cipher, that is, by so changing the order of the letters of the alphabet, that not a word could be made out.”

Let’s attempt the same strategy with the Affine cipher.

Brute Forcing the Affine Cipher#

Suppose you intercept the following ciphertext and you suspect it was enciphered using the Affine cipher:

GJLKT FJKXN AOTXU XAVXN KTNPJ JLKGN CYXKT WKJLP YCGJK CYJAC YHTFJ ACHAX ACNAX DANCH JA

We can import text_clean() and affine() to try all possible keys:

ciphertext = 'GJLKT FJKXN AOTXU XAVXN KTNPJ JLKGN CYXKT WKJLP YCGJK CYJAC YHTFJ ACHAX ACNAX DANCH JA'

for test_akey in range(0, 26):
    for test_mkey in [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]:
        print( 'akey:',testakey,' mkey:', testmkey, affine(ciphertext, test_akey, test_mkey, encipher=False))
akey: 0  mkey: 1 gjlktfjkxnaotxuxavxnktnpjjlkgncyxktwkjlpycgjkcyjacyhtfjachaxacnaxdanchja
akey: 0  mkey: 3 cdvmptdmznawpzyzahznmpnfddvmcnsizmpqmdvfiscdmsidasilptdaslazasnazbanslda
akey: 0  mkey: 5 whxcjbhcpnaijpepazpncjndhhxcwnqkpcjuchxdkqwhcqkhaqkrjbhaqrapaqnaplanqrha
akey: 0  mkey: 7 mfjuzxfuhnaczhohadhnuznrffjumnewhuzsufjrwemfuewfaewbzxfaebahaenahtanebfa
akey: 0  mkey: 9 sbhefpbernaqfriralrnefntbbhesngurefoebhtugsbegubaguvfpbagvaragnarjangvba
akey: 0  mkey: 11 kpbixrpivnagxvqvajvnixnzppbiknmovixcipbzomkpimopamodxrpamdavamnavfanmdpa
akey: 0  mkey: 15 qlzsdjlsfnaudfkfarfnsdnbllzsqnomfsdyslzbmoqlsomlaomxdjlaoxafaonafvanoxla
akey: 0  mkey: 17 iztwvlzwjnakvjsjapjnwvnhzztwinugjwvmwzthguizwugzaugfvlzaufajaunajranufza
akey: 0  mkey: 19 ovrgbdvgtnaybtmtaxtngbnjvvrgonwetgbigvrjewovgwevawezbdvawzatawnathanwzva
akey: 0  mkey: 21 etdyrztylnasrlwlablnyrnxttdyenkqlyrgytdxqketykqtakqjrztakjalaknalpankjta
akey: 0  mkey: 23 yxfolhxobnaelbcbatbnolnvxxfoynisbolkoxfvsiyxoisxaisplhxaipabainabzanipxa
akey: 0  mkey: 25 urpqhvrqdnamhdgdafdnqhnlrrpqunycdqheqrplcyurqycraycthvraytadaynadxanytra
akey: 1  mkey: 1 fikjseijwmznswtwzuwmjsmoiikjfmbxwjsvjikoxbfijbxizbxgseizbgzwzbmzwczmbgiz
akey: 1  mkey: 3 tumdgkudqerngqpqryqedgewuumdtejzqdghdumwzjtudjzurjzcgkurjcrqrjerqsrejcur
akey: 1  mkey: 5 bmchogmhusfnoujufeushosimmchbsvpuhozhmcipvbmhvpmfvpwogmfvwfufvsfuqfsvwmf
akey: 1  mkey: 7 xqufkiqfsylnkszslosyfkycqqufxyphsfkdfquchpxqfphqlphmkiqlpmlslpylselypmql
akey: 1  mkey: 9 pyebcmybokxncofoxiokbckqyyebpkdrobclbyeqrdpybdryxdrscmyxdsxoxdkxogxkdsyx
akey: 1  mkey: 11 rwipeywpcuhnecxchqcupeugwwiprutvcpejpwigvtrwptvwhtvkeywhtkhchtuhcmhutkwh
akey: 1  mkey: 15 jeslwcelygtnwydytkyglwgueesljghfylwrlesufhjelhfethfqwcethqtythgtyotghqet
akey: 1  mkey: 17 lcwzyoczmqdnymvmdsmqzyqkccwzlqxjmzypzcwkjxlczxjcdxjiyocdxidmdxqdmudqxicd
akey: 1  mkey: 19 dkgvqskvicpnqibipmicvqcykkgvdcltivqxvkgytldkvltkpltoqskplopiplcpiwpclokp
akey: 1  mkey: 21 zoytmuotgivnmgrgvwgitmisooytziflgtmbtoyslfzotflovflemuovfevgvfivgkvifeov
akey: 1  mkey: 23 hgoxuqgxkwjnuklkjckwxuweggoxhwrbkxutxgoebrhgxrbgjrbyuqgjryjkjrwjkijwrygj
akey: 1  mkey: 25 vsqriwsreobniehebgeoriomssqrvozderifrsqmdzvsrzdsbzduiwsbzubebzobeybozusb
akey: 2  mkey: 1 ehjirdhivlymrvsvytvlirlnhhjielawviruihjnwaehiawhyawfrdhyafyvyalyvbylafhy
akey: 2  mkey: 3 klduxbluhviexhghiphvuxvnlldukvaqhuxyuldnqakluaqliaqtxbliatihiavihjivatli
akey: 2  mkey: 5 grhmtlrmzxkstzozkjzxmtxnrrhmgxauzmtemrhnuagrmaurkaubtlrkabkzkaxkzvkxabrk
akey: 2  mkey: 7 ibfqvtbqdjwyvdkdwzdjqvjnbbfqijasdqvoqbfnsaibqasbwasxvtbwaxwdwajwdpwjaxbw
akey: 2  mkey: 9 mvbyzjvylhukzlcluflhyzhnvvbymhaolyziyvbnoamvyaovuaopzjvuapuluahulduhapvu
akey: 2  mkey: 11 ydpwlfdwjbouljejoxjbwlbnddpwybacjwlqwdpncaydwacdoacrlfdoarojoabojtobardo
akey: 2  mkey: 15 cxlepvxerzmgprwrmdrzepznxxleczayrepkexlnyacxeayxmayjpvxmajmrmazmrhmzajxm
akey: 2  mkey: 17 ofzcbrfcptgqbpypgvptcbtnffzcotampcbscfznmaofcamfgamlbrfgalgpgatgpxgtalfg
akey: 2  mkey: 19 szvkfhzkxrecfxqxebxrkfrnzzvksraixkfmkzvniaszkaizeaidfhzeadexearexleradze
akey: 2  mkey: 21 ujtohpjobdqihbmbqrbdohdnjjtoudagbohwojtngaujoagjqagzhpjqazqbqadqbfqdazjq
akey: 2  mkey: 23 qpxgdzpgtfswdtutsltfgdfnppxgqfaktgdcgpxnkaqpgakpsakhdzpsahstsafstrsfahps
akey: 2  mkey: 25 wtrsjxtsfpcojfifchfpsjpnttrswpaefsjgstrneawtsaetcaevjxtcavcfcapcfzcpavtc
akey: 3  mkey: 1 dgihqcghukxlquruxsukhqkmggihdkzvuhqthgimvzdghzvgxzveqcgxzexuxzkxuaxkzegx
akey: 3  mkey: 3 bculosclymzvoyxyzgymlomecculbmrhyloplcuehrbclrhczrhkosczrkzyzrmzyazmrkcz
akey: 3  mkey: 5 lwmryqwrecpxyetepoecrycswwmrlcfzeryjrwmszflwrfzwpfzgyqwpfgpepfcpeapcfgwp
akey: 3  mkey: 7 tmqbgembouhjgovohkoubguymmqbtuldobgzbmqydltmbldmhldigemhlihohluhoahulimh
akey: 3  mkey: 9 jsyvwgsvierhwizircievwekssyvjexlivwfvsyklxjsvxlsrxlmwgsrxmrirxeriarexmsr
akey: 3  mkey: 11 fkwdsmkdqivbsqlqveqidsiukkwdfihjqdsxdkwujhfkdhjkvhjysmkvhyvqvhivqavihykv
akey: 3  mkey: 15 vqexioqxksfzikpkfwksxisgqqexvstrkxidxqegrtvqxtrqftrcioqftcfkftsfkafstcqf
akey: 3  mkey: 17 ricfeuifswjtesbsjyswfewqiicfrwdpsfevficqpdrifdpijdpoeuijdojsjdwjsajwdoij
akey: 3  mkey: 19 hokzuwozmgtrumfmtqmgzugcookzhgpxmzubzokcxphozpxotpxsuwotpstmtpgtmatgpsot
akey: 3  mkey: 21 peojckejwyldcwhwlmwyjcyieeojpyvbwjcrjeoibvpejvbelvbuckelvulwlvylwalyvuel
akey: 3  mkey: 23 zygpmiypcobfmcdcbucopmowyygpzojtcpmlpygwtjzypjtybjtqmiybjqbcbjobcabojqyb
akey: 3  mkey: 25 xustkyutgqdpkgjgdigqtkqouustxqbfgtkhtusofbxutbfudbfwkyudbwdgdbqdgadqbwud
akey: 4  mkey: 1 cfhgpbfgtjwkptqtwrtjgpjlffhgcjyutgpsgfhluycfgyufwyudpbfwydwtwyjwtzwjydfw
akey: 4  mkey: 3 stlcfjtcpdqmfpopqxpdcfdvttlcsdiypcfgctlvyistciytqiybfjtqibqpqidqprqdibtq
akey: 4  mkey: 5 qbrwdvbwjhucdjyjutjhwdhxbbrwqhkejwdowbrxekqbwkebukeldvbuklujukhujfuhklbu
akey: 4  mkey: 7 exbmrpxmzfsurzgzsvzfmrfjxxbmefwozmrkmxbjowexmwoxswotrpxswtszswfszlsfwtxs
akey: 4  mkey: 9 gpvstdpsfboetfwfozfbstbhppvsgbuifstcspvhiugpsuipouijtdpoujofoubofxobujpo
akey: 4  mkey: 11 mrdkztrkxpcizxsxclxpkzpbrrdkmpoqxkzekrdbqomrkoqrcoqfztrcofcxcopcxhcpofrc
akey: 4  mkey: 15 ojxqbhjqdlysbdidypdlqblzjjxqolmkdqbwqjxzkmojqmkjymkvbhjymvydymlydtylmvjy
akey: 4  mkey: 17 ulfihxlivzmwhvevmbvzihztllfiuzgsvihyilftsguligslmgsrhxlmgrmvmgzmvdmzgrlm
akey: 4  mkey: 19 wdzojldobvigjbubifbvojvrddzowvembojqodzrmewdoemdiemhjldiehibievibpivehdi
akey: 4  mkey: 21 kzjexfzertgyxrcrghrtextdzzjektqwrexmezjdwqkzeqwzgqwpxfzgqpgrgqtgrvgtqpzg
akey: 4  mkey: 23 ihpyvrhylxkovlmlkdlxyvxfhhpyixsclyvuyhpfcsihyschksczvrhkszklksxkljkxszhk
akey: 4  mkey: 25 yvtulzvuhreqlhkhejhrulrpvvtuyrcghuliuvtpgcyvucgvecgxlzvecxehecrehbercxve
akey: 5  mkey: 1 begfoaefsivjospsvqsifoikeegfbixtsforfegktxbefxtevxtcoaevxcvsvxivsyvixcev
akey: 5  mkey: 3 jkctwaktguhdwgfghogutwumkkctjuzpgtwxtkcmpzjktzpkhzpswakhzshghzuhgihuzskh
akey: 5  mkey: 5 vgwbiagbomzhiodozyombimcggwbvmpjobitbgwcjpvgbpjgzpjqiagzpqzozpmzokzmpqgz
akey: 5  mkey: 7 pimxcaixkqdfckrkdgkqxcquiimxpqhzkxcvximuzhpixhzidhzecaidhedkdhqdkwdqheid
akey: 5  mkey: 9 dmspqampcylbqctclwcypqyemmspdyrfcpqzpmsefrdmprfmlrfgqamlrglclrylculyrgml
akey: 5  mkey: 11 tykrgayrewjpgezejsewrgwiyykrtwvxerglrykixvtyrvxyjvxmgayjvmjejvwjeojwvmyj
akey: 5  mkey: 15 hcqjuacjwerluwbwriwejuesccqjhefdwjupjcqsdfhcjfdcrfdouacrforwrferwmrefocr
akey: 5  mkey: 17 xoilkaolycpzkyhypeyclkcwooilxcjvylkbloiwvjxoljvopjvukaopjupypjcpygpcjuop
akey: 5  mkey: 19 lsodyasdqkxvyqjqxuqkdykgssodlktbqdyfdsogbtlsdtbsxtbwyasxtwxqxtkxqexktwsx
akey: 5  mkey: 21 fuezsauzmobtsmxmbcmozsoyuuezfolrmzshzueyrlfuzlrublrksaublkbmblobmqbolkub
akey: 5  mkey: 23 rqyheaqhugtxeuvutmughegoqqyhrgbluhedhqyolbrqhblqtblieaqtbitutbgtustgbiqt
akey: 5  mkey: 25 zwuvmawvisfrmilifkisvmsqwwuvzsdhivmjvwuqhdzwvdhwfdhymawfdyfifdsficfsdywf
akey: 6  mkey: 1 adfenzderhuinroruprhenhjddfeahwsrenqedfjswadewsduwsbnzduwburuwhurxuhwbdu
akey: 6  mkey: 3 abtknrbkxlyunxwxyfxlknldbbtkalqgxknokbtdgqabkqgbyqgjnrbyqjyxyqlyxzylqjby
akey: 6  mkey: 5 albgnflgtremntitedtrgnrhllbgaruotgnyglbhoualguoleuovnfleuveteuretperuvle
akey: 6  mkey: 7 atxinltivboqnvcvorvbinbfttxiabskvingitxfksatisktoskpnltospovosbovhobspto
akey: 6  mkey: 9 ajpmnxjmzviynzqzitzvmnvbjjpmavoczmnwmjpbcoajmocjiocdnxjiodiziovizrivodji
akey: 6  mkey: 11 afrynhfyldqwnlglqzldyndpffryadcelynsyfrpecafycefqcetnhfqctqlqcdqlvqdctfq
akey: 6  mkey: 15 avjcntvcpxkenpupkbpxcnxlvvjcaxywpcnicvjlwyavcywvkywhntvkyhkpkyxkpfkxyhvk
akey: 6  mkey: 17 arlondrobfscnbkbshbfonfzrrloafmyboneorlzymaromyrsmyxndrsmxsbsmfsbjsfmxrs
akey: 6  mkey: 19 ahdsnphsfzmknfyfmjfzsnzvhhdsaziqfsnushdvqiahsiqhmiqlnphmilmfmizmftmzilhm
akey: 6  mkey: 21 apzunvpuhjwonhshwxhjunjtppzuajgmhuncupztmgapugmpwgmfnvpwgfwhwgjwhlwjgfpw
akey: 6  mkey: 23 azhqnjzqdpcgndedcvdpqnpxzzhqapkudqnmqzhxukazqkuzckurnjzckrcdckpcdbcpkrzc
akey: 6  mkey: 25 axvwnbxwjtgsnjmjgljtwntrxxvwateijwnkwxvrieaxweixgeiznbxgezgjgetgjdgtezxg
akey: 7  mkey: 1 zcedmycdqgthmqnqtoqgdmgiccedzgvrqdmpdceirvzcdvrctvramyctvatqtvgtqwtgvact
akey: 7  mkey: 3 rskbeisbocpleonopwocbecusskbrchxobefbskuxhrsbhxsphxaeisphapophcpoqpchasp
akey: 7  mkey: 5 fqglskqlywjrsynyjiywlswmqqglfwztylsdlqgmtzfqlztqjztaskqjzajyjzwjyujwzaqj
akey: 7  mkey: 7 leitywetgmzbygngzcgmtymqeeitlmdvgtyrteiqvdletdvezdvaywezdazgzdmzgszmdaez
akey: 7  mkey: 9 xgmjkugjwsfvkwnwfqwsjksyggmjxslzwjktjgmyzlxgjlzgflzakugflafwflsfwofslagf
akey: 7  mkey: 11 hmyfuomfskxdusnsxgskfukwmmyfhkjlsfuzfmywljhmfjlmxjlauomxjaxsxjkxscxkjamx
akey: 7  mkey: 15 tocvgmoviqdxginiduiqvgqeoocvtqrpivgbvoceprtovrpodrpagmodradidrqdiydqraod
akey: 7  mkey: 17 duorqgureivfqenevkeirqicuuordipberqhruocbpdurpbuvpbaqguvpavevpivemvipauv
akey: 7  mkey: 19 pwshcewhuobzcunubyuohcokwwshpoxfuhcjhwskfxpwhxfwbxfacewbxabubxobuiboxawb
akey: 7  mkey: 21 vkupiqkpcerjicncrscepieokkupvebhcpixpkuohbvkpbhkrbhaiqkrbarcrbercgrebakr
akey: 7  mkey: 23 jiqzwsizmylpwmnmlemyzwygiiqzjytdmzwvziqgdtjiztdiltdawsiltalmltylmklytail
akey: 7  mkey: 25 bywxocyxkuhtoknkhmkuxousyywxbufjkxolxywsjfbyxfjyhfjaocyhfahkhfuhkehufayh
akey: 8  mkey: 1 ybdclxbcpfsglpmpsnpfclfhbbdcyfuqpclocbdhquybcuqbsuqzlxbsuzspsufspvsfuzbs
akey: 8  mkey: 3 ijbsvzjsftgcvfefgnftsvtljjbsityofsvwsjbloyijsyojgyorvzjgyrgfgytgfhgtyrjg
akey: 8  mkey: 5 kvlqxpvqdbowxdsdondbqxbrvvlqkbeydqxiqvlryekvqeyvoeyfxpvoefodoebodzobefvo
akey: 8  mkey: 7 wptejhperxkmjryrknrxejxbpptewxogrejceptbgowpeogpkogljhpkolkrkoxkrdkxolpk
akey: 8  mkey: 9 udjghrdgtpcshtktcntpghpvddjgupiwtghqgdjvwiudgiwdciwxhrdcixctcipctlcpixdc
akey: 8  mkey: 11 otfmbvtmzrekbzuzenzrmbrdttfmorqszmbgmtfdsqotmqsteqshbvteqhezeqrezjerqhte
akey: 8  mkey: 15 mhvozfhobjwqzbgbwnbjozjxhhvomjkibozuohvxikmhokihwkitzfhwktwbwkjwbrwjkthw
akey: 8  mkey: 17 gxrutjxuhlyithqhynhlutlfxxruglsehutkuxrfesgxusexysedtjxysdyhyslyhpylsdxy
akey: 8  mkey: 19 elhwrtlwjdqorjcjqnjdwrdzllhwedmujwrywlhzumelwmulqmuprtlqmpqjqmdqjxqdmplq
akey: 8  mkey: 21 qfpkdlfkxzmedxixmnxzkdzjffpkqzwcxkdskfpjcwqfkwcfmwcvdlfmwvmxmwzmxbmzwvfm
akey: 8  mkey: 23 srzifbrivhuyfvwvunvhifhprrzishcmvifeirzpmcsricmrucmjfbrucjuvuchuvtuhcjru
akey: 8  mkey: 25 czxypdzylviuplolinlvypvtzzxycvgklypmyzxtkgczygkzigkbpdzigbiligvilfivgbzi
akey: 9  mkey: 1 xacbkwaboerfkolormoebkegaacbxetpobknbacgptxabtpartpykwartyrorterouretyar
akey: 9  mkey: 3 zasjmqajwkxtmwvwxewkjmkcaasjzkpfwjmnjascfpzajpfaxpfimqaxpixwxpkxwyxkpiax
akey: 9  mkey: 5 paqvcuavigtbcixitsigvcgwaaqvpgjdivcnvaqwdjpavjdatjdkcuatjktitjgtietgjkat
akey: 9  mkey: 7 haepusapcivxucjcvycipuimaaephizrcpunpaemrzhapzravzrwusavzwvcvzivcovizwav
akey: 9  mkey: 9 ragdeoadqmzpeqhqzkqmdemsaagdrmftqdendagstfradftazftueoazfuzqzfmzqizmfuaz
akey: 9  mkey: 11 vamticatgylrigbglugytiykaamtvyxzgtintamkzxvatxzalxzoicalxolglxylgqlyxoal
akey: 9  mkey: 15 faohsyahucpjsuzupguchscqaaohfcdbuhsnhaoqbdfahdbapdbmsyapdmpupdcpukpcdmap
akey: 9  mkey: 17 jauxwmaxkoblwktkbqkoxwoiaauxjovhkxwnxauihvjaxvhabvhgwmabvgbkbvobksbovgab
akey: 9  mkey: 19 tawlgialysfdgyryfcyslgsoaawltsbjylgnlawojbtalbjafbjegiafbefyfbsfymfsbeaf
akey: 9  mkey: 21 lakfygafsuhzysdshisufyueaakflurxsfynfakexrlafrxahrxqygahrqhshruhswhurqah
akey: 9  mkey: 23 bairokareqdhoefedweqroqyaairbqlveronraiyvlbarlvadlvsokadlsdedlqdecdqlsad
akey: 9  mkey: 25 dayzqeazmwjvqmpmjomwzqwuaayzdwhlmzqnzayulhdazhlajhlcqeajhcjmjhwjmgjwhcaj
akey: 10  mkey: 1 wzbajvzandqejnknqlndajdfzzbawdsonajmazbfoswzasozqsoxjvzqsxqnqsdqntqdsxzq
akey: 10  mkey: 3 qrjadhranbokdnmnovnbadbtrrjaqbgwnadearjtwgqragwrogwzdhrogzonogbonpobgzro
akey: 10  mkey: 5 ufvahzfanlyghncnyxnlahlbffvauloinahsafvbioufaoifyoiphzfyopynyolynjylopfy
akey: 10  mkey: 7 slpafdlantgifnungjntaftxllpastkcnafyalpxckslakclgkchfdlgkhgngktgnzgtkhlg
akey: 10  mkey: 9 oxdablxanjwmbnenwhnjabjpxxdaojcqnabkaxdpqcoxacqxwcqrblxwcrwnwcjwnfwjcrxw
akey: 10  mkey: 11 chtapjhanfsypninsbnfapfrhhtacfegnapuahtrgechaeghsegvpjhsevsnsefsnxsfevhs
akey: 10  mkey: 15 ythalrtanviclnsniznvalvjtthayvwunalgathjuwytawutiwuflrtiwfiniwvindivwfti
akey: 10  mkey: 17 mdxazpdanreoznwnetnrazrlddxamryknazqadxlkymdaykdeykjzpdeyjeneyrenveryjde
akey: 10  mkey: 19 iplavxpanhusvngnurnhavhdpplaihqynavcapldyqipaqypuqytvxpuqtunuqhunbuhqtpu
akey: 10  mkey: 21 gvfatbvanpcutnyncdnpatpzvvfagpmsnatiavfzsmgvamsvcmsltbvcmlcncmpcnrcpmlvc
akey: 10  mkey: 23 kjraxtjanzmqxnonmfnzaxzhjjrakzuenaxwajrheukjauejmuebxtjmubmnmuzmnlmzubjm
akey: 10  mkey: 25 ebzarfbanxkwrnqnkpnxarxvbbzaeximnaroabzvmiebaimbkimdrfbkidknkixknhkxidbk
akey: 11  mkey: 1 vyaziuyzmcpdimjmpkmcziceyyazvcrnmzilzyaenrvyzrnyprnwiuyprwpmprcpmspcrwyp
akey: 11  mkey: 3 hiaruyiresfbuedefmesruskiiarhsxneruvriaknxhirxnifxnquyifxqfefxsfegfsxqif
akey: 11  mkey: 5 zkafmekfsqdlmshsdcsqfmqgkkafzqtnsfmxfkagntzkftnkdtnumekdtudsdtqdsodqtukd
akey: 11  mkey: 7 dwalqowlyertqyfyruyelqeiwwaldevnylqjlwainvdwlvnwrvnsqowrvsryrverykrevswr
akey: 11  mkey: 9 luaxyiuxkgtjykbktekgxygmuuaxlgznkxyhxuamnzluxznutznoyiutzotktzgtkctgzout
akey: 11  mkey: 11 joahwqohumzfwupuziumhwmyooahjmlnuhwbhoaynljohlnozlncwqozlczuzlmzuezmlcoz
akey: 11  mkey: 15 rmatekmtgobveglgbsgoteocmmatropngteztmacnprmtpnmbpnyekmbpybgbpobgwbopymb
akey: 11  mkey: 17 pgadcsgdquhrcqzqhwqudcuoggadpubnqdctdgaonbpgdbnghbnmcsghbmhqhbuhqyhubmgh
akey: 11  mkey: 19 xeapkmepcwjhkcvcjgcwpkwseeapxwfncpkrpeasnfxepfnejfnikmejfijcjfwjcqjwfiej
akey: 11  mkey: 21 bqavowqvikxpoitixyikvokuqqavbkhnivodvqaunhbqvhnqxhngowqxhgxixhkximxkhgqx
akey: 11  mkey: 23 tsajgcsjwivzgwxwvowijgiqssajtidnwjgfjsaqndtsjdnsvdnkgcsvdkvwvdivwuvidksv
akey: 11  mkey: 25 fcabsgcboylxsorolqoybsywccabfyjnobspbcawnjfcbjncljnesgcljeloljyloilyjecl
akey: 12  mkey: 1 uxzyhtxylbochlilojlbyhbdxxzyubqmlyhkyxzdmquxyqmxoqmvhtxoqvoloqbolrobqvxo
akey: 12  mkey: 3 yzrilpzivjwslvuvwdvjiljbzzriyjoevilmizrbeoyzioezwoehlpzwohwvwojwvxwjohzw
akey: 12  mkey: 5 epfkrjpkxviqrxmxihxvkrvlppfkevysxkrckpflsyepkyspiyszrjpiyzixiyvixtivyzpi
akey: 12  mkey: 7 ohlwbzhwjpcebjqjcfjpwbpthhlwopgyjwbuwhltygohwgyhcgydbzhcgdcjcgpcjvcpgdhc
akey: 12  mkey: 9 irxuvfruhdqgvhyhqbhduvdjrrxuidwkhuveurxjkwiruwkrqwklvfrqwlqhqwdqhzqdwlrq
akey: 12  mkey: 11 qvhodxvobtgmdbwbgpbtodtfvvhoqtsubodiovhfusqvosuvgsujdxvgsjgbgstgblgtsjvg
akey: 12  mkey: 15 kftmxdfmzhuoxzezulzhmxhvfftmkhigzmxsmftvgikfmigfuigrxdfuiruzuihuzpuhirfu
akey: 12  mkey: 17 sjdgfvjgtxkuftctkztxgfxrjjdgsxeqtgfwgjdrqesjgeqjkeqpfvjkepktkexktbkxepjk
akey: 12  mkey: 19 mtpezbterlywzrkryvrlezlhttpemlucrezgetphcumteuctyucxzbtyuxyryulyrfyluxty
akey: 12  mkey: 21 wlvqjrlqdfskjdodstdfqjfpllvqwfcidqjyqlvpicwlqcilscibjrlscbsdscfsdhsfcbls
akey: 12  mkey: 23 cbjsplbsfreipfgfexfrsprzbbjscrmwfsposbjzwmcbsmwbemwtplbemtefemrefdermtbe
akey: 12  mkey: 25 gdbcthdcpzmytpspmrpzctzxddbcgzkopctqcdbxokgdckodmkofthdmkfmpmkzmpjmzkfdm
akey: 13  mkey: 1 twyxgswxkanbgkhknikaxgacwwyxtaplkxgjxwyclptwxplwnplugswnpunknpankqnapuwn
akey: 13  mkey: 3 pqizcgqzmanjcmlmnumazcasqqizpafvmzcdzqisvfpqzfvqnfvycgqnfynmnfanmonafyqn
akey: 13  mkey: 5 jukpwoupcanvwcrcnmcapwaquukpjadxcpwhpukqxdjupdxundxewoundencndancynadeun
akey: 13  mkey: 7 zswhmkshuanpmubunquahmaesswhzarjuhmfhswejrzshrjsnrjomksnronunranugnarosn
akey: 13  mkey: 9 fourscoreandsevenyearsagoourfathersbroughtforthonthiscontinentanewnation
akey: 13  mkey: 11 xcovkecviantkidinwiavkamccovxazbivkpvcombzxcvzbcnzbqkecnzqninzanisnazqcn
akey: 13  mkey: 15 dymfqwyfsanhqsxsnesafqaoyymfdabzsfqlfymozbdyfbzynbzkqwynbknsnbansinabkyn
akey: 13  mkey: 17 vmgjiymjwanxiwfwncwajiaummgjvahtwjizjmguthvmjhtmnhtsiymnhsnwnhanwenahsmn
akey: 13  mkey: 19 bietoqitganlogzgnkgatoawiietbajrgtovtiewrjbitjrinjrmoqinjmngnjangunajmin
akey: 13  mkey: 21 rgqlemglyanfeyjynoyaleakggqlraxdyletlgqkdxrglxdgnxdwemgnxwnynxanycnaxwgn
akey: 13  mkey: 23 lksbyukboanryopongoabyaikksblavfobyxbksifvlkbvfknvfcyuknvcnonvanomnavckn
akey: 13  mkey: 25 hecduiedqanzuqtqnsqaduayeecdhalpqdurdecyplhedlpenlpguienlgnqnlanqknalgen
akey: 14  mkey: 1 svxwfrvwjzmafjgjmhjzwfzbvvxwszokjwfiwvxbkosvwokvmoktfrvmotmjmozmjpmzotvm
akey: 14  mkey: 3 ghzqtxhqdreatdcdeldrqtrjhhzqgrwmdqtuqhzjmwghqwmhewmptxhewpedewredferwphe
akey: 14  mkey: 5 ozpubtzuhfsabhwhsrhfubfvzzpuofichubmuzpvciozuiczsicjbtzsijshsifshdsfijzs
akey: 14  mkey: 7 kdhsxvdsflyaxfmfybflsxlpddhsklcufsxqsdhpuckdscudycuzxvdyczyfyclyfrylczdy
akey: 14  mkey: 9 clropzlobxkapbsbkvbxopxdllrocxqebopyolrdeqcloqelkqefpzlkqfkbkqxkbtkxqflk
akey: 14  mkey: 11 ejvcrljcphuarpkpudphcrhtjjvcehgipcrwcjvtigejcgijugixrljugxupughupzuhgxju
akey: 14  mkey: 15 wrfyjpryltgajlqlgxltyjthrrfywtuslyjeyrfhsuwryusrgusdjprgudglgutglbgtudrg
akey: 14  mkey: 17 ypjmlbpmzdqalzizqfzdmldxppjmydkwzmlcmpjxwkypmkwpqkwvlbpqkvqzqkdqzhqdkvpq
akey: 14  mkey: 19 qxtidfxivpcadvovczvpidplxxtiqpygvidkixtlgyqxiygxcygbdfxcybcvcypcvjcpybxc
akey: 14  mkey: 21 mblgzhbgtviaztetijtvgzvfbblgmvsytgzogblfysmbgsybisyrzhbisritisvitxivsrbi
akey: 14  mkey: 23 utbkhdtkxjwahxyxwpxjkhjrttbkujeoxkhgktbroeutkeotweolhdtwelwxwejwxvwjeltw
akey: 14  mkey: 25 ifdevjferboavrurotrbevbzffdeibmqrevsefdzqmifemqfomqhvjfomhoromborlobmhfo
akey: 15  mkey: 1 ruwvequviylzeifilgiyveyauuwvrynjivehvuwajnruvnjulnjsequlnslilnyliolynsul
akey: 15  mkey: 3 xyqhkoyhuivrkutuvcuihkiayyqhxinduhklhyqadnxyhndyvndgkoyvngvuvnivuwvingyv
akey: 15  mkey: 5 teuzgyezmkxfgmbmxwmkzgkaeeuztknhmzgrzeuahnteznhexnhogyexnoxmxnkxmixknoex
akey: 15  mkey: 7 vosdigodqwjliqxqjmqwdiwaoosdvwnfqdibdosafnvodnfojnfkigojnkjqjnwjqcjwnkoj
akey: 15  mkey: 9 ziolmwilyuhxmypyhsyulmuaiiolzunbylmvlioabnzilnbihnbcmwihnchyhnuhyqhuncih
akey: 15  mkey: 11 lqcjysqjwobhywrwbkwojyoaqqcjlonpwjydjqcapnlqjnpqbnpeysqbnebwbnobwgboneqb
akey: 15  mkey: 15 pkyrcikremztcejezqemrcmakkyrpmnlercxrkyalnpkrnlkznlwcikznwzeznmzeuzmnwkz
akey: 15  mkey: 17 bsmpoespcgtdoclcticgpogassmpbgnzcpofpsmaznbspnzstnzyoestnytctngtcktgnyst
akey: 15  mkey: 19 fmixsumxkerpskdkrokexseammixfenvkxszxmiavnfmxnvmrnvqsumrnqrkrnerkyrenqmr
akey: 15  mkey: 21 hwgbucwboqdvuozodeoqbuqawwgbhqntobujbwgatnhwbntwdntmucwdnmdodnqdosdqnmwd
akey: 15  mkey: 23 dcktqmctgsfjqghgfygstqsaccktdsnxgtqptckaxndctnxcfnxuqmcfnufgfnsfgefsnucf
akey: 15  mkey: 25 jgefwkgfscpbwsvspuscfwcaggefjcnrsfwtfgearnjgfnrgpnriwkgpnipspncpsmpcnigp
akey: 16  mkey: 1 qtvudptuhxkydhehkfhxudxzttvuqxmihudgutvzimqtumitkmirdptkmrkhkmxkhnkxmrtk
akey: 16  mkey: 3 ophybfpylzmiblklmtlzybzrpphyozeulybcyphrueopyeupmeuxbfpmexmlmezmlnmzexpm
akey: 16  mkey: 5 yjzeldjerpcklrgrcbrpelpfjjzeypsmrelwejzfmsyjesmjcsmtldjcstcrcspcrncpstjc
akey: 16  mkey: 7 gzdotrzobhuwtbibuxbhothlzzdoghyqbotmozdlqygzoyqzuyqvtrzuyvubuyhubnuhyvzu
akey: 16  mkey: 9 wflijtfivreujvmvepvrijrxffliwrkyvijsiflxykwfikyfekyzjtfekzevekrevnerkzfe
akey: 16  mkey: 11 sxjqfzxqdviofdydirdvqfvhxxjqsvuwdqfkqxjhwusxquwxiuwlfzxiulidiuvidnivulxi
akey: 16  mkey: 15 idrkvbdkxfsmvxcxsjxfkvftddrkifgexkvqkdrtegidkgedsgepvbdsgpsxsgfsxnsfgpds
akey: 16  mkey: 17 evpsrhvsfjwgrfofwlfjsrjdvvpsejqcfsrisvpdcqevsqcvwqcbrhvwqbwfwqjwfnwjqbvw
akey: 16  mkey: 19 ubxmhjbmztgehzszgdztmhtpbbxmutckzmhombxpkcubmckbgckfhjbgcfgzgctgzngtcfbg
akey: 16  mkey: 21 crbwpxrwjlyqpjujyzjlwplvrrbwcliojwpewrbvoicrwioryiohpxryihyjyilyjnylihry
akey: 16  mkey: 23 mltczvlcpboszpqpohpbczbjlltcmbwgpczycltjgwmlcwglowgdzvlowdopowbopnobwdlo
akey: 16  mkey: 25 khfgxlhgtdqcxtwtqvtdgxdbhhfgkdostgxughfbsokhgoshqosjxlhqojqtqodqtnqdojhq
akey: 17  mkey: 1 psutcostgwjxcgdgjegwtcwyssutpwlhgtcftsuyhlpstlhsjlhqcosjlqjgjlwjgmjwlqsj
akey: 17  mkey: 3 fgypswgpcqdzscbcdkcqpsqiggypfqvlcpstpgyilvfgpvlgdvloswgdvodcdvqdcedqvogd
akey: 17  mkey: 5 doejqiojwuhpqwlwhgwujqukooejduxrwjqbjoekrxdojxrohxryqiohxyhwhxuhwshuxyoh
akey: 17  mkey: 7 rkozeckzmsfhemtmfimszeswkkozrsjbmzexzkowbjrkzjbkfjbgeckfjgfmfjsfmyfsjgkf
akey: 17  mkey: 9 tcifgqcfsobrgsjsbmsofgoucciftohvsfgpfciuvhtcfhvcbhvwgqcbhwbsbhobskbohwcb
akey: 17  mkey: 11 zeqxmgexkcpvmkfkpykcxmcoeeqxzcbdkxmrxeqodbzexbdepbdsmgepbspkpbcpkupcbsep
akey: 17  mkey: 15 bwkdouwdqylfoqvqlcqydoymwwkdbyzxqdojdwkmxzbwdzxwlzxiouwlzilqlzylqglyziwl
akey: 17  mkey: 17 hysvukyvimzjuirizoimvumgyysvhmtfivulvysgfthyvtfyztfeukyzteziztmziqzmteyz
akey: 17  mkey: 19 jqmbwyqboivtwohovsoibwieqqmbjirzobwdbqmezrjqbrzqvrzuwyqvruvovrivocviruqv
akey: 17  mkey: 21 xmwrksmregtlkepetuegrkgqmmwrxgdjerkzrmwqjdxmrdjmtdjcksmtdctetdgteitgdcmt
akey: 17  mkey: 23 vuclieulykxbiyzyxqykliksuuclvkfpylihlucspfvulfpuxfpmieuxfmxyxfkxywxkfmux
akey: 17  mkey: 25 lighymihuerdyuxurwuehyeciighleptuhyvhigctplihptirptkymirpkrurperuorepkir
akey: 18  mkey: 1 ortsbnrsfviwbfcfidfvsbvxrrtsovkgfsbesrtxgkorskgrikgpbnrikpifikviflivkpri
akey: 18  mkey: 3 wxpgjnxgthuqjtstubthgjhzxxpgwhmctgjkgxpzcmwxgmcxumcfjnxumfutumhutvuhmfxu
akey: 18  mkey: 5 itjovntobzmuvbqbmlbzovzpttjoizcwbovgotjpwcitocwtmcwdvntmcdmbmczmbxmzcdtm
akey: 18  mkey: 7 cvzkpnvkxdqspxexqtxdkpdhvvzkcdumxkpikvzhmucvkumvqumrpnvqurqxqudqxjqdurvq
akey: 18  mkey: 9 qzfcdnzcplyodpgpyjplcdlrzzfcqlespcdmczfrseqzceszyestdnzyetypyelyphyletzy
akey: 18  mkey: 11 glxetnlerjwctrmrwfrjetjvllxegjikretyelxvkigleiklwikztnlwizwrwijwrbwjizlw
akey: 18  mkey: 15 updwhnpwjreyhjojevjrwhrfppdwursqjwhcwpdfqsupwsqpesqbhnpesbejesrejzersbpe
akey: 18  mkey: 17 kbvyxnbylpcmxlulcrlpyxpjbbvykpwilyxoybvjiwkbywibcwihxnbcwhclcwpcltcpwhbc
akey: 18  mkey: 19 yfbqlnfqdxkildwdkhdxqlxtffbqyxgodqlsqfbtogyfqgofkgojlnfkgjkdkgxkdrkxgjfk
akey: 18  mkey: 21 shrmfnhmzbogfzkzopzbmfblhhrmsbyezmfumhrleyshmyehoyexfnhoyxozoybozdobyxho
akey: 18  mkey: 23 edlurnduhtgkrhihgzhturtbddluetoyhurqudlbyoeduoydgoyvrndgovghgotghfgtovdg
akey: 18  mkey: 25 mjhiznjivfsezvyvsxvfizfdjjhimfquvizwijhduqmjiqujsqulznjsqlsvsqfsvpsfqljs
akey: 19  mkey: 1 nqsramqreuhvaebehceurauwqqsrnujferadrqswfjnqrjfqhjfoamqhjohehjuhekhujoqh
akey: 19  mkey: 3 nogxaeoxkylhakjklskyxayqoogxnydtkxabxogqtdnoxdtoldtwaeoldwlkldylkmlydwol
akey: 19  mkey: 5 nyotasytgerzagvgrqgetaeuyyotnehbgtaltyoubhnythbyrhbiasyrhirgrhergcrehiyr
akey: 19  mkey: 7 ngkvaygviobdaipibeiovaosggkvnofxivatvgksxfngvfxgbfxcaygbfcbibfobiubofcgb
akey: 19  mkey: 9 nwczakwzmivlamdmvgmizaiowwcznibpmzajzwcopbnwzbpwvbpqakwvbqvmvbivmevibqwv
akey: 19  mkey: 11 nselauslyqdjaytydmyqlaqcsselnqprylaflsecrpnslprsdprgausdpgdydpqdyidqpgsd
akey: 19  mkey: 15 niwpagipckxrachcxockpakyiiwpnkljcpavpiwyjlnipljixljuagixluxcxlkxcsxkluix
akey: 19  mkey: 17 neybaqebosfpaoxofuosbasmeeybnszlobarbeymlznebzlefzlkaqefzkfofzsfowfszkef
akey: 19  mkey: 19 nuqfacufsmzxaslszwsmfamiuuqfnmvdsfahfuqidvnufvduzvdyacuzvyzszvmzsgzmvyuz
akey: 19  mkey: 21 ncmhaichuwjbaufujkuwhawgccmhnwtzuhaphcmgztnchtzcjtzsaicjtsjujtwjuyjwtscj
akey: 19  mkey: 23 nmudawmdqcptaqrqpiqcdackmmudncxhqdazdmukhxnmdxhmpxheawmpxepqpxcpqopcxemp
akey: 19  mkey: 25 nkijaokjwgtfawzwtywgjagekkijngrvwjaxjkievrnkjrvktrvmaoktrmtwtrgtwqtgrmkt
akey: 20  mkey: 1 mprqzlpqdtguzdadgbdtqztvpprqmtiedqzcqprveimpqiepgienzlpgingdgitgdjgtinpg
akey: 20  mkey: 3 efxorvfobpcyrbabcjbporphffxoepukborsofxhkuefoukfcuknrvfcuncbcupcbdcpunfc
akey: 20  mkey: 5 sdtyfxdyljweflalwvljyfjzddtysjmglyfqydtzgmsdymgdwmgnfxdwmnwlwmjwlhwjmndw
akey: 20  mkey: 7 yrvgljrgtzmoltatmptzglzdrrvgyzqitglegrvdiqyrgqirmqinljrmqnmtmqzmtfmzqnrm
akey: 20  mkey: 9 ktzwxhtwjfsixjajsdjfwxflttzwkfymjwxgwtzlmyktwymtsymnxhtsynsjsyfsjbsfynts
akey: 20  mkey: 11 uzlshbzsfxkqhfafktfxshxjzzlsuxwyfshmszljywuzswyzkwynhbzkwnkfkwxkfpkxwnzk
akey: 20  mkey: 15 gbpitzbivdqktvavqhvditdrbbpigdecvitoibprcegbiecbqecntzbqenqvqedqvlqdenbq
akey: 20  mkey: 17 qhbedthervisdrarixrvedvphhbeqvcoreduehbpocqhecohicondthicniricvirzivcnhi
akey: 20  mkey: 19 cjfuprjuhbomphaholhbupbxjjfucbkshupwujfxskcjuksjoksnprjoknohokbohvobknjo
akey: 20  mkey: 21 ixhcvdxcprewvpapefprcvrbxxhciroupcvkcxhbuoixcouxeounvdxeonepeorepteronxe
akey: 20  mkey: 23 wvdmjfvmzlycjzazyrzlmjltvvdmwlgqzmjimvdtqgwvmgqvygqnjfvygnyzyglyzxylgnvy
akey: 20  mkey: 25 oljkbplkxhugbxaxuzxhkbhflljkohswxkbykljfwsolkswluswnbplusnuxushuxruhsnlu
akey: 21  mkey: 1 loqpykopcsftyczcfacspysuooqplshdcpybpoqudhlophdofhdmykofhmfcfhsfcifshmof
akey: 21  mkey: 3 vwofimwfsgtpisrstasgfigywwofvglbsfijfwoyblvwflbwtlbeimwtletstlgtsutglewt
akey: 21  mkey: 5 xiydkcidqobjkqfqbaqodkoeiiydxorlqdkvdiyelrxidrlibrlskcibrsbqbrobqmborsib
akey: 21  mkey: 7 jcgrwucrekxzwelexaekrwkoccgrjkbterwprcgotbjcrbtcxbtywucxbyxexbkxeqxkbycx
akey: 21  mkey: 9 hqwtueqtgcpfugxgpagctuciqqwthcvjgtudtqwijvhqtvjqpvjkueqpvkpgpvcpgypcvkqp
akey: 21  mkey: 11 bgszoigzmerxomhmramezoeqggszbedfmzotzgsqfdbgzdfgrdfuoigrdurmrdermwredugr
akey: 21  mkey: 15 zuibmsubowjdmotojaowbmwkuuibzwxvobmhbuikvxzubxvujxvgmsujxgjojxwjoejwxguj
akey: 21  mkey: 17 tkehgwkhuylvgudulauyhgyskkehtyfruhgxhkesrftkhfrklfrqgwklfqlulfyluclyfqkl
akey: 21  mkey: 19 ryujegyjwqdbewpwdawqjeqmyyujrqzhwjeljyumhzryjzhydzhcegydzcdwdzqdwkdqzcyd
akey: 21  mkey: 21 dscxqysxkmzrqkvkzakmxqmwsscxdmjpkxqfxscwpjdsxjpszjpiqyszjizkzjmzkozmjisz
akey: 21  mkey: 23 femvsoeviuhlsijihaiuvsuceemvfupzivsrvemczpfevpzehpzwsoehpwhihpuhighupweh
akey: 21  mkey: 25 pmklcqmlyivhcybyvayilcigmmklpitxylczlmkgxtpmltxmvtxocqmvtovyvtivysvitomv
akey: 22  mkey: 1 knpoxjnobresxbybezbroxrtnnpokrgcboxaonptcgknogcnegclxjneglebegrebherglne
akey: 22  mkey: 3 mnfwzdnwjxkgzjijkrjxwzxpnnfwmxcsjwzawnfpscmnwcsnkcsvzdnkcvkjkcxkjlkxcvnk
akey: 22  mkey: 5 cndiphnivtgopvkvgfvtiptjnndictwqvipaindjqwcniwqngwqxphngwxgvgwtgvrgtwxng
akey: 22  mkey: 7 unrchfncpvikhpwpilpvchvznnrcuvmepchacnrzemuncmenimejhfnimjipimvipbivmjni
akey: 22  mkey: 9 entqrbnqdzmcrdudmxdzqrzfnntqezsgdqraqntfgsenqsgnmsghrbnmshmdmszmdvmzshnm
akey: 22  mkey: 11 inzgvpngtlyevtotyhtlgvlxnnzgilkmtgvagnzxmkingkmnykmbvpnykbytyklytdylkbny
akey: 22  mkey: 15 snbuflnuhpcwfhmhcthpufpdnnbuspqohufaunbdoqsnuqoncqozflncqzchcqpchxcpqznc
akey: 22  mkey: 17 wnhkjznkxboyjxgxodxbkjbvnnhkwbiuxkjaknhvuiwnkiunoiutjznoitoxoiboxfobitno
akey: 22  mkey: 19 gnjytvnylfsqtlelsplfytfbnnjygfowlytaynjbwognyownsowrtvnsorslsofslzsforns
akey: 22  mkey: 21 ynxsltnsfhumlfqfuvfhslhrnnxsyhekfslasnxrkeynseknuekdltnuedufuehufjuhednu
akey: 22  mkey: 23 onvebxnerdqubrsrqjrdebdlnnveodyirebaenvliyoneyinqyifbxnqyfqrqydqrpqdyfnq
akey: 22  mkey: 25 qnlmdrnmzjwidzczwbzjmdjhnnlmqjuyzmdamnlhyuqnmuynwuypdrnwupwzwujwztwjupnw
akey: 23  mkey: 1 jmonwimnaqdrwaxadyaqnwqsmmonjqfbanwznmosbfjmnfbmdfbkwimdfkdadfqdagdqfkmd
akey: 23  mkey: 3 dewnquenaobxqazabiaonqogeewndotjanqrnewgjtdentjebtjmquebtmbabtobacbotmeb
akey: 23  mkey: 5 hsinumsnayltuapalkaynuyossinhybvanufnsiovbhsnbvslbvcumslbclalbylawlybcsl
akey: 23  mkey: 7 fycnsqynagtvsahatwagnsgkyycnfgxpanslnyckpxfynxpytxpusqytxutatxgtamtgxuyt
akey: 23  mkey: 9 bkqnoyknawjzoarajuawnowckkqnbwpdanoxnkqcdpbknpdkjpdeoykjpejajpwjasjwpekj
akey: 23  mkey: 11 pugncwunasflcavafoasncseuugnpsrtanchnugetrpunrtufrticwufrifafrsfakfsriuf
akey: 23  mkey: 15 lgunyegnaivpyafavmainyiwggunlijhanytnguwhjlgnjhgvjhsyegvjsvavjivaqvijsgv
akey: 23  mkey: 17 zqknmcqnaerbmajargaenmeyqqknzelxanmdnqkyxlzqnlxqrlxwmcqrlwrarlerairelwqr
akey: 23  mkey: 19 vcynikcnauhfiataheauniuqccynvudlanipncyqldvcndlchdlgikchdghahduhaohudgch
akey: 23  mkey: 21 tisngoinacphgalapqacngcmiisntczfangvnismfztinzfipzfygoipzypapzcpaepczyip
akey: 23  mkey: 23 xwenkgwnamzdkabazsamnkmuwwenxmhrankjnweurhxwnhrwzhrokgwzhozazhmzayzmhowz
akey: 23  mkey: 25 romnesonakxjeadaxcaknekioomnrkvzanebnomizvronvzoxvzqesoxvqxaxvkxauxkvqox
akey: 24  mkey: 1 ilnmvhlmzpcqvzwzcxzpmvprllnmipeazmvymlnraeilmealceajvhlcejczcepczfcpejlc
akey: 24  mkey: 3 uvnehlverfsohrqrszrfehfxvvneufkarehievnxakuvekavskadhlvskdsrskfsrtsfkdvs
akey: 24  mkey: 5 mxnszrxsfdqyzfufqpfdszdtxxnsmdgafszksxntagmxsgaxqgahzrxqghqfqgdqfbqdghxq
akey: 24  mkey: 7 qjnydbjylregdlslehlrydrvjjnyqrialydwyjnvaiqjyiajeiafdbjeifeleirelxerifje
akey: 24  mkey: 9 yhnklvhkxtgwlxoxgrxtkltzhhnkytmaxklukhnzamyhkmahgmablvhgmbgxgmtgxpgtmbhg
akey: 24  mkey: 11 wbnujdbuhzmsjhchmvhzujzlbbnuwzyahujoubnlaywbuyabmyapjdbmypmhmyzmhrmzypbm
akey: 24  mkey: 15 ezngrxzgtboirtytoftbgrbpzzngebcatgrmgznpacezgcazocalrxzoclotocbotjobclzo
akey: 24  mkey: 17 ctnqpftqdhuepdmdujdhqphbttnqchoadqpgqtnbaoctqoatuoazpftuozuduohudluhoztu
akey: 24  mkey: 19 krncxzrcpjwuxpipwtpjcxjfrrnckjsapcxecrnfaskrcsarwsavxzrwsvwpwsjwpdwjsvrw
akey: 24  mkey: 21 odnibjdivxkcbvgvklvxibxhddnioxuavibqidnhauodiuadkuatbjdkutkvkuxkvzkxutdk
akey: 24  mkey: 23 gfnwtpfwjvimtjkjibjvwtvdffnwgvqajwtswfndaqgfwqafiqaxtpfiqxijiqvijhivqxfi
akey: 24  mkey: 25 spnoftpoblykfbebydblofljppnoslwabofcopnjawspowapywarftpywrybywlybvylwrpy
akey: 25  mkey: 1 hkmlugklyobpuyvybwyoluoqkkmlhodzyluxlkmqzdhkldzkbdziugkbdibybdobyebodikb
akey: 25  mkey: 3 lmevycmviwjfyihijqiwvywommevlwbrivyzvmeorblmvbrmjbruycmjbujijbwjikjwbumj
akey: 25  mkey: 5 rcsxewcxkivdekzkvukixeiyccsxrilfkxepxcsyflrcxlfcvlfmewcvlmvkvlivkgvilmcv
akey: 25  mkey: 7 buyjomujwcprowdwpswcjocguuyjbctlwjohjuygltbujtluptlqomuptqpwptcpwipctqup
akey: 25  mkey: 9 vekhisehuqdtiuludouqhiqweekhvqjxuhirhekwxjvehjxedjxyisedjydudjqdumdqjyed
akey: 25  mkey: 11 diubqkibogtzqojotcogbqgsiiubdgfhobqvbiushfdibfhitfhwqkitfwtotfgtoytgfwit
akey: 25  mkey: 15 xsgzkqszmuhbkmrmhymuzkuissgzxuvtmzkfzsgitvxszvtshvtekqshvehmhvuhmchuvesh
akey: 25  mkey: 17 fwqtsiwtgkxhsgpgxmgktskewwqtfkrdgtsjtwqedrfwtrdwxrdcsiwxrcxgxrkxgoxkrcwx
akey: 25  mkey: 19 zgcrmogreyljmexelieyrmyuggcrzyhpermtrgcuphzgrhpglhpkmoglhklelhyleslyhkgl
akey: 25  mkey: 21 jyidweydqsfxwqbqfgqsdwscyyidjspvqdwldyicvpjydpvyfpvoweyfpofqfpsfqufspoyf
akey: 25  mkey: 23 powfcyofservcstsrksefcemoowfpezjsfcbfowmjzpofzjorzjgcyorzgrsrzersqrezgor
akey: 25  mkey: 25 tqopguqpcmzlgcfczecmpgmkqqoptmxbcpgdpqokbxtqpxbqzxbsguqzxszczxmzcwzmxsqz

Wow, that’s a lot. The eagle eyed among you may have noticed:

akey: 13  mkey: 9 fourscoreandsevenyearsagoourfathersbroughtforthonthiscontinentanewnation

somewhere in the long stream of the output. This process worked, but is still very labor intensive to look through the long list of potential plaintexts. The following code attempts to reduce the amount of output by only showing potential plaintexts that contain the string 'the' or 'and' since those are common words in the English language.

ciphertext = 'GJLKT FJKXN AOTXU XAVXN KTNPJ JLKGN CYXKT WKJLP YCGJK CYJAC YHTFJ ACHAX ACNAX DANCH JA'

for test_akey in range(0, 26):
    for test_mkey in [1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25]:
        candidate_plaintext = affine(ciphertext, test_mkey, test_akey, False)
        if ('the' in candidate_plaintext) or ('and' in candidate_plaintext):
            print( 'akey:',testakey,' mkey:', testmkey, candidate_plaintext)
akey: 10  mkey: 1 wzbajvzandqejnknqlndajdfzzbawdsonajmazbfoswzasozqsoxjvzqsxqnqsdqntqdsxzq
akey: 13  mkey: 9 fourscoreandsevenyearsagoourfathersbroughtforthonthiscontinentanewnation
akey: 20  mkey: 17 qhbedthervisdrarixrvedvphhbeqvcoreduehbpocqhecohicondthicniricvirzivcnhi

This only returns 3 possibilities: akey: 10 mkey: 1 contains 'and', akey: 20 mkey: 17 contains 'the' and akey: 13 mkey: 9 which is the correct plaintext.

It’s easy to see that this definitely reduces the possibilities, but it relies on being able to guess some words in the plaintext. It would be better if we could write a function crack_affine() that takes in the ciphertext and returns the plaintext automatically without the need for any guess and check or visual inspection. By the end of this chapter, you’ll be able to do that! But first you’ll need to learn some statistical analysis.