Exercises¶
Problem 1
Write a function named caesar_groups() that accepts a ciphertext string and a positive integer \(K\) (the length of the Vigenère key used to encrypt the ciphertext).
Return a list of the \(K\) Caesar groups, each represented as a single string, in the order of their corresponding key positions.
Test Cases
print(caesar_groups("ABCDEFGHIJK", 2))
print(caesar_groups("ABCDEFGHIJK", 3))
print(caesar_groups("ABCDEFGHIJK", 4))
['ACEGIK', 'BDFHJ']
['ADGJ', 'BEHK', 'CFI']
['AEI', 'BFJ', 'CGK', 'DH']
Problem 2
Write a function named letter_frequency() that accepts a string representing a decrypted Caesar group (perhaps with the correct key, perhaps not).
Return a NumPy array of length 26 whose entry at index \(i\) is the fraction of characters in the string that equal the letter at index \(i\) of the alphabet (index 0 for A, index 1 for B, and so on).
Reminder: s.count(sub) returns the number of times the substring sub occurs in the string s.
Test Cases
print(letter_frequency("AB"))
print(letter_frequency("AAAAAAABZZ"))
print(letter_frequency("THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG"))
[0.5 0.5 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. ]
[0.7 0.1 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0.2]
[0.02857143 0.02857143 0.02857143 0.02857143 0.08571429 0.02857143
0.02857143 0.05714286 0.02857143 0.02857143 0.02857143 0.02857143
0.02857143 0.02857143 0.11428571 0.02857143 0.02857143 0.05714286
0.02857143 0.05714286 0.05714286 0.02857143 0.02857143 0.02857143
0.02857143 0.02857143]
Problem 3
Write a function named best_caesar_key() that accepts a ciphertext string representing a single Caesar group.
For each possible key \(\text{A}\)–\(\text{Z}\),
Decrypt the ciphertext with that key via
vigenere_decrypt()from Lab 6 Problem 2.Compute the letter frequencies of the candidate plaintext with
letter_frequency()from Problem 2.Compute the dot product of those letter frequencies with \(\mathbf{f}\), the vector of letter frequencies for general English.
Return the Caesar key (as a single-character string) that produces the largest dot product. If several keys tie, return the first in alphabetical order.
Test Cases
s = "KYVHLZTBSIFNEWFOALDGJFMVIKYVCRQPUFX"
key = best_caesar_key(s)
print(key)
print(vigenere_decrypt(s, key))
R
THEQUICKBROWNFOXJUMPSOVERTHELAZYDOG
s = "IBMUSWUHSIOMYY"
key = best_caesar_key(s)
print(key)
print(vigenere_decrypt(s, key))
U
OHSAYCANYOUSEE
Problem 4
Write a function named vigenere_crack() that accepts a string of ciphertext that was encrypted with a Vigenère cipher whose key is unknown.
Estimate the length of the key with
key_length()from Lab 6 Problem 5.Split the ciphertext into its Caesar groups with
caesar_groups()from Problem 1.Find the best Caesar key for each Caesar group with
best_caesar_key()from Problem 3.Join the Caesar keys (in order) to form the Vigenère key.
Decrypt the ciphertext with this key using
vigenere_decrypt()from Lab 6 Problem 2.
Return both the key and the decrypted plaintext.
Note: The key_length() function searches only lengths 1 through 20, and both the length estimate and the frequency analysis can be inaccurate, especially for short messages.
If the estimated length is a multiple of the true key length and each Caesar key is correctly identified, the recovered key is the true key repeated (for example, FUNFUNFUN instead of FUN), which still decrypts the ciphertext correctly.
Test Cases
Decrypt the following ciphertexts.
CZVEILTUPRIMCGKBTVSVXVJRTCIBTSQQJHBVHVPKQRJSEUMHMGFBPXWXDOAMECWQTUCZXGIBBVLXGIHBFSDGESBTXLBESFJIWTFDRGTTWKBGQXWXDCBMLTKUWFVIGPCGEGESBPUOWXXMJOQPSEBEHHTIHHTQBPZTKUOGKSCLKBVVECWYVNVMHMJSHUIDYCPBQOIAQITJXPEKQRYMIAQIGRMRMWFRUSGVQBIGVHTVWBPWHHUVRYEHVQBFKHTKKBTKRWXTCJPQXGFOFYIAECGFJIRHWZQHSGMJSUQXSTAANFIWXTTRGPKXTMFNITIAOAFWINRWQYLTMJSEVLTINSNUYGXQTZCOXGIOQCMHREVNKRLHWZQDILHTHUVLTMTCHDPTHHURVXXGIICCRSIKQXKRVMJSQCMHBGGJJICLWRQGRARCKUKXTKCPOKXLBVVCKRZXASFTECVNCFGFNAGFGJIGXYOFPSIAKBTUSKXTMEGQPKMOONIXGVVNVRDKFWQCPXVGHUKRZBVGBXIGROIPJSJMQTGJILTAHBJIPKVVRTEQUKHFCCIHKHFGPUHJRRCVDAFSNTMHACZYDIATVSJJICLJSGJSJZJHVVSKXTOSVIGPCFQUMIHEQHTVTWVCUGVIACHFJIDNIVGVSWTXSJQRSXTSQCXIAKGOWXPMVVRVMBXKHNNPHXGARFUJBVSACXJKCZOWXLAGBGJIGTDPVVERMWOYNCIHQYNYEIVJCHVSUBVGJCMHMECNVTDVMSGCRSEQCXGHPMKHNPHIAGBUWVGBGRBPEABESFVEGMGRGQLTKHSRVJDKKHSNEHAGRNEVDLUVRTQXGFHUCXHAGVNFRTOGFOGJDKGGRGRPKCPOKXLBVVRKXWXTOJCMHMECNVTDVMSGQVPPCHPJXDMCYRQYIHHWGCRSUWFAKRVPKHUEYGBQGVVCHAGFNPERKQGFVLTYKSYFEUMGFVVECWHCEVYCTVSYAAPLLIFVMCMKARVSHXGWGRSEWQKACPPKISECFQBVVBNIJGFSEVLTAGRTGMCTPCGJIGFQARPXSHYBJGRITNWPGEUMGFVVRTOGFBPGTVQBFKHTKKBTJSLBPHUGADKNRFJILTUHBIIIHWHNIEXGVVRTEQUKHUQPTPGBGUXGTKUUVSCEKYRCXJGPSYHSGLQARYENTPRGJICWKDCGHHNFRRPPNWQKAUSHNFRRPPNMJOGCPXVGVNFRDMCABOICMVCGJMCDCPBWXHMQDCKRVAGFFGPUUGTBTIHAGTBWRSAGFFGPUYCZYKRVWQKACZTKARRGTLXNZRKXWXTHUGATENKNUZTKARRGTDKUVRHIAEXSEAWAHYZLHSGLJSUCHEEGBGASUMKARCWHAGKRPXSHYBGQPDHMOOQYIAGFNPHIHYCAFIGPJOGYEHZQWAIXDACDCGRCXZHSKVHMUVRVVXXFHBNSDDFCJPECWOOXGSJMYVNVWWXYOFESBBPUGQFJMKHJCWIHQRNTOIHUSRCRNMJWAIXWXPGUGPDHMSQCXIAGGVFIHHHHUGATENOAFRDMKQRFXWTVHUGCLXTSSKPAXFKVVLRNRPBCVSLCBQDSDDUVRNZTLJSEGECWVVRTIHAGGNYQPIUOAFTXVVIEGWWNPUHRSCIGUFULTMQCXFSLGCXNTJGHOCAGSUMJSFJIAOGGNUWWXROFUISBVKNUPPUGZYGHDKCBTGQPKOOYCHTUWHGQLTKIFRCXSBUOCRSXGVARPXXMYOFGQEMAGUGHXWPCGNMZXVCQTSEMJSWCVUHTTRCVDYMWYNMCZUCZGFDWAGBOECTISQVSENVWGKRIHQBRQJIAGQHRFDTTRFCWHAGTRNPETUHVVATENHUQYVAVOYKGTMQVRTWTEHOSVIGLWQUCJPENOFVLXLKGUCPAMJWAMRDMJWAISUMWAONMCZFCJPWITKFFJSLUTOIGXWXAZYCPAMJWAMQTTVVBOILAAWJQYAWPHFCCPGAHUKRVTDCHVMIXXSAKJXYGZYQJUMJSGQTDYVVRJSJLGKUKGWPCGIGVNEKYRNCIKWSQQACWQKAFSLGYCHNHIAGTNNPCXXSEESBXVCNPICWKKBPHTKJCJOECROWYGWXOGTNNPTGDMGJMHMKARULTLCWQCPDNFWZWWIUGURVXXGIGBOILAGFRPIPKVVREICMTSBHXWXGOEVLAXVARUITMJOGYSJEFPRHSJKVVBWWPGFAVNIHWQKAKXWBPYSQVNHWGRGEABESUCHAXCFAVWTOGFNNXWBPUFQJIAKGFQVIBPVRTPTLUCAUMCMJSFELDHNFBQQPGFHUQYVAVVVUAPLPCGCZTKAUBQHDIRCEVYCBVMSQVHAQKVPKDYHVRTOCHYZRFKTTUHUGVTPCGAQSCXVCYKWIXPHBJIGLVWYNMIPCGTQSSITOPVMRXVCFCCXMQJRTCTLVVNVWPUQIGVLTKKUUVHXLVOAEIQNVHUGRXPQBQGVLACHYCXXMWRRQVAHPUVVYSXKJRISIMQOYKGTACRAQMSXCKUCXATVWGWHTPCGBTPDGIWGWHTXKHUGVQNVHUQYVAVHUGCLXTSAKGTZTOAFADKFGGQWPRRFRUICMNMFJIQXIOACKPBPWJQRSXTWSKWWTNZSCPAKKUUVXWKQITJXWXGOEVLWHYTHPRNBVZYUITFVCPQQTHWHNOSCZVVRRIDINSGJEIPCZXYMIAVVRKVWXCRFFSLGYOEFXWXCBGKTPMJWRUMIAKBXULTPCGECXWXTUYCHIAGFRYEHGQCAGPXLVSAKRVMJWFVMBXCGVVHXWPHFQYCWCHNNPIAGFVILIPQFQDYIBUVNNPWTXSGQEHDVVROAWTVHUGRPFGCSVLTVQIAVVNBUMBWOCHYDYGEHXOONOMHMJWFPILSGOYCRSHTOHUXGTNWNCRSLJSGTMTWVCPWVILGMNUWWXUDBMIUTPQLEYGMUSLKRVTUMBWVTYCZYKRVMJFBWKWMJSNKVSHACHVLXGMMBWGDNNRZCRPZGWGCRSPJOGCRXZPCECRIEKHGNIVBTZFJIAEVVVPOBXHCECWZBPUAQMIENBRXIGWQHBCWZIGFUCTHBUVNNPHXGWGYVXMVSAWTHHOSJJIGXFCJPHDPPRBYRIAGFRYEHGQHUKRVXNGRVSSHUCNNMRXUCBPFTZCBGCPZBPUNIEXGFWACLAEOWFUQTOGFLOYRAVCAKKWMKGUQYAWVVVPOSBPOUYEHMJSPCXXAQDRVLTRNZEGQTFDSEJIGLCIPGVDYOWYMEIMGOGKQTWKBNJQNWGOEKAXLJMBWATKGRBYRWXTSJKXWFGHUGVTTTSAQQXVGWAVLTTKFVOEUKCWQDYIRQIZKKWMEOGELPUCHNPHIACHFXIGRNWXGEBHWGRASJDPCJDYIWQQNVWTTVPNVWXPQBQGVPGFVRTIPEKQRDIVTPHBIIIKCHUGVHEGSCAECWYSAVSCLCMVPKIHJSEUIAYKBNFVTTOMFQVIHHKNAHDVCHFGEIUCHFFSRTVGRCXQTVGNPHHHOSGKQTLFCOCXHXCHPCXHYQFLQYHXGOFULTVQIYFRITPGJGVTBVVRTUJXUHVQRXMFWQPXBNEVZCXIXTKUKGWPCMFJIENVWGULTYGZGVLPMUVRYEHWQNVPKDYHOAFLPWLIFVFTZWBGQHGXCAGJEILJSJCWLTNYVPKWTPRVPLPGFKVVLSBPOUCRSLCMVPKIHJSEXIGRGOEPIHMNMAQASBPOUVIAEOSGJIIKWHUFMSRQIRXIGXCHNDEIPJSAUYSWGBYAXWNODGJYBIFCJPWWXEOZGYEHPOUGEEHHGGKGZLCBQFVNEGOIGWPGFHUGJPENKNUSKXTOYKGTPCGAQXPUKHUWVITPRFJIYNODRFYEHPHBJIGYGSGKRPFQARPXHAGZBQOTWWDOWXXMYOFCPAWCFXQZTKJSNFFTYQFRJIGPCGNPSIAGFYQRVICGFCKTTPRGJILAKHRTEQUKHJCWHMKZYKRHBIVGJYGKAWAIHDPPWGVLTKGKNURDMCABOICMVCOGPDLVOJCCLXPHNNMRXNWXGXWXYWAFECWYOFLYHMKBGKQTMQVRCVXMUOLCWXMVIEPISTECEPIGHJALGEGLCBQYLXLMSEULDPNOGGMILISGVMCZUVRYEHVNCFGFTAKBQKXLAGBFJIINTBRFXWXECEPIGUWHGJIGTDPVVAPLPCYQRVXTHBDIHXGBFJIUHWBQJIGLGZSKRPEQBTNSLACZYYLXVJKNUPXMWDOAEGHYCSNEBIUVNPKXGITEQQIAGFBQJIAGFRYIGXFCBTWPENFBWRSMJSUCPAUWHGJINPGFRCPAEQQXGHPGFKUGRPEKQRJESUGSACPAMJSJCCSHYBBPIHBFSNPHJIVVRQXWXTHEAMCZGJRTCSHQFFJILTNYRFWPWNMQQACMJSZKHSEGKBPHTKKBTJSLLJSJCWTOGFGQKTMQIGCKPBPGHFHTGNMFJIRTOSHRSCTNWGVPTMJFRGPTZISQVEQEGOYNQPWGCSUSABFUYCWHMJSEGAPLPCGJMCZQBVVIMVGDGCXXGAUBNHTGMSLCRSTNWPGWUBTGGVLDNIVGYEHMJOGKXBBIVGDIAHPUGQSCXQTGJISHQFFQJIAGVNNPQNVOYCWTBVVRTXWXNCPMWLXTSGQSATTURQVIAGYRAAPLVCBUQPENPHVEITPMECXTBVKBWPSGQHBRICTPMBHXWXOVBYIKXTCAVLTLGQBPHIBOSEQYCWUVREEBXWDBPEAHYQHTXPBPGUGLPWPCGPSIBESQDIUHTSNPHQXJWAFMIPCGNNMIMNSQQSGTDCHVJXYVSRPMCVJSFJMVAUVRVVXXFHUGPXMVZRISAWGBXGCXGVVRNSRDCBQVSWXTUEGEIWGZVILIBVTVVXTWCZVEIDIGBRFXWXFCBTECWHCHPHIACHVVPTWKBGQEHFCZYREHLCURPSIFWQUNEGZGFGJECTTOGJSAXUVRMRTEVRBYRPGFZBQOTWCZBPKIAGDNUWPZGWAVSIAGZBXIABGGGIEGWGBLQYTOGFFCAWHYGUGPDGISQVSVXVCHVSUMJOGFEGDJOYNECWYOAFIGTDCHVEBHPUGJSHXDSQUSUUTWTJXUEQKRTWPGFHUQWTVQCYHSJGVOVPWQNVGUGGDNNRAQXTOGBTGXWXTVRCHIATCHILIAGRBQVLTAOAFIKXPWSOCWXCRJQYAWICGJVDNIVGJSJZJHCQSGTNWPGMIPQIYFFTHHJRTCABVHYGYHXYWGJSJMOMFJSJEFSEUSWAQKVYMHAKQBWPSLJIGWTABMSNVIAXUQBRIXMJWAMMRHWZQKJXHPZLMRTPJCJVSQXIWAHSGRQIFGIHHOOAASJMQTGJILTAHUKRVLJOQJEEIGBRFPPMGZLVLPMCZVEIWTFPRIYCMQHUKRZMJOGXIGRHSJVLXGIGVPHTXFKRTIGXCZYAMBIQGFKFAXVVRTIHXGARFXDUGBBWWTBPKNKXXGIPLVLTEKHGNISHQFFQWWXYSAVFPVMHBVLTMCPYGLPEHVBRMCZUVROMVAVTVPHPGQHUGVZXACAKXDKCHNPCGTVSNDSDDQTEWPTLHCEULJMVWAITTHRZRWTABMSGGPTLECCGWIAKGGKQTLJSSQYCWCZVVXAXDCGVPTHPWGYLXVJQRTXPBPZLYEHGQHUGVTUGTBTIHTKRNNMRXCBQTSJGFHUGRTVMCSVLTUQHGNILTUOCCTTKNOOGPLBVVGJILHTRFFVXGMARDIPNVWSWPARRFVPXTWQBVVMCECFTGPTMVSEUMIPCGNNPKXTMJGPAMQGNAHGBPYZGFJMVVRYMHXNWGVPTTNWPGAPLPCGISXGIHBFSIACHVPEWNTFLPSXENZBQOUBTGGULTLCWQCRSLGSJJIIAGFVVWBTTYRFTDBUCAQVCHVTBTWWXJOQTIPWUSIGVPEPWPGPXMVZRJMHMQFVGWPUQIGELXEFFRPAWHJOQISIUWFAVECWGOGGRJIDMJKPSUGOFVWPGFCGJIGNPDYGEHTPHGJMCZUOYNFTVCIFGXWXAKBWPSGQHEGQTFDSEVLTLKACNIGNNSFVLTBTTEKICWUVNFXPNIVGVLTFUIPJEHMJOGCVTWJCGRSZXTKVNPQNTBLQYXYACHJSAWKHGQSAHPUNPHIACHVHCDNEIGASJKHWAIIGOGFLFITINMJKXWTMBVHIXMWGHCPARDZRGHHTPRFJIWTFBRXIGYQFTQXIXPHUCXXYACHFVXGMAHELUKQANDSIMNSZCVZXFDBKWDGKHVUEAFQGGEIGMCWAVSSBUOTTITPKHUASJLQCAGVDKNOGGVWHYSIGVIAKGOQXIEGKNURDMOOEMISIQWFQRHHCZVEIKXPHHTISMQHNUXTBVOAFJXGFWAIMIOGFLPMRXKHUCHXGHOPVEHHTHBHQXQGRSNEKHWFBHGWXTFLVEGMEIFVEGWRWAGEEINSEQEHMVIEMINMQTSGIPGFVBVFJMVSEGHIHCGGULTOGFLUSDGHWAKWWXFWGQJU
CGEOFNUMPRMGWTGCZMGVNJIGGBRECEMGWTGCZMGVNJIGGBRIURISEWFXBUWGQNAHUYNOSBZSWCYCFPBRMFQHJUFBVRYCWQUISJSYCRNWGQNAHUYRXCPBBNWAWEMRHFVBMVNJIGGBRASNMBVCSFVOVGCGEOFNUMGRUFWBBZQIFXHRAGVNJIGGBRADECAOCSBBXSVNJIGGBREWANRZCSXRADNCEESUUQMJRLLBVVHTJSSIEMIFQRPOQHBBVVHTJSSIEMIFQRESEYNTZTIVVUQCEMQGNBPSNPRVKRQRZSNFYOCVHTLWEYPBHUYBBVRLJIMVHFPCENGPSCYEQCQQNAGBZNZZVERBVRJEMGRHGXSECBLHUUGACZYBNWGMAWWFCRAHNOGPCECGQSFCAAWFNRLCACGAPRCAOFRWRQJRXSWFTIBLCEZBZSICYQBGBRAICYETOGCIMRRAEMSBZPWACUEQGBHBVZLNUMFRQRZSNEVVUJCGPOYUEOSWUJIBQUDCSRHJQHUUCTOVHSIQRIABVRNUZCAYBNSAAYIBQNUMFRQRZSNEVVUJCGPOYUEOSWUJIBQUDCSRHJQHUUSIWEZNKSBHGPSGBEWBRISNFNHPMWAVBBVPIHVHECRAWGQNAQYYNZSENUIBPLLAHNFGWHUYYWFQMBNHUYFBOGYCZSFYEDSFISTCNPRAOAXSQGUYFBVNNGPWAAFQBTYAMFNFJMFRMRBHYYQNCEYIMFVNJIGGBRGSNLBNCHLYWFQIAMHUIHAOAXFMJRHUCBQLRLOAXFMJRHGGTVPRADVLVBINFEMJRFNBWBHFESEYPWBPYQMRGIRVUYUALOGNUIHSUIWIEYQXSECBLOFUGBVVMZZGFIHBVPIGBVNXEMQRHGTMNNGIWAYQPSEZVDSNHQBKRHGQSGBOTSFMRLPVLGPRNSBNKUIZIDEICPSGCPXFVPNBSVHGPSYCSMUHUELGUUQPSEUYLSQNUMGHVYQARUCXSNLNVQRVLIBAIHVQVHTBVNNNZFNHTMARHGAKRLRUOQYSWFGBRAKNFYWKVHTCDBZYWBQIAIBQQRAHZCAAHRLRDSANUMQBWXTOAYTPCFNUIROYRVZNCQWBYSNZCHHQLCMYAWTLYNZGNZGMFEUCXWAABCHVNFUSFMNOSFUFBVRMCQFVNFWTGBVAJRLLGSNLYIGGJNAHFOCMFAUGCFNFYGRRZVKWRHGQBBLVOWAUYQHLLNXDRXBCHGBRQFFGRZSZYFAOTYFQBGBRMOENUTMBLQMFBZRDSANFPOQFNBSYSPWARNBBVRYAOZVMUKFBQAIBQJRWDYYSZCZUPWBTLRAGBZOZWGCFPGHVWMQGMVVOZYEQQNQUQQUMGZOAARBCEYYIHRBNDSCLBDSQGBZSVGCWFGUABHBNUMVHGNVFNWRBVNHNVMPIZUIACPIHVIAAMRNEMQRCIMRGBEWITBNVMBZGPSPBVKYRHFWTGBRKCPEYIBRVEWCQZEIBPYYMGFZNDCHLRLCANUMKUIYMOFNBUOGNRZGFJVZWGONTHUUAPSEMVAHRLBNHUYFPWRFQIBQNEQRRHGZCYFRLKVNUMLPYRLWAAFUCBNUVSFMQWKABVTZZUXQBTJNXSEGBVSLUALGCYALWAAVBIAXRZHUYTCWQUAKSBZUMFPBEQGGCNVDNMGWFFMUMSANRZHNCAMRUYEASYZOMGVXRAKVNUAIPBUCANHRIQUCRDSZYABGNMFMBGYAKWAANGCHNUBCUUIMVVMUIBQMPCHBZSPWFNBVUHYGWFAIHBKVNUXWAWRZGNHQPWFVBLMOOEVSQUYQJRVRKOHMRPSUUQVCGEAMSYYQLCJHVVHUYEIWANBLCUIAWIENBIRVLGGDEIPMGFCBVCSGBVYFQUQQUJNAGRXJQHUCAPWFPVMKNNNLWFNNVQRISACZYSQTGSBZGVRGGMNLQAWGCFTWXYYGSAIHOVGBNBFBIGMRVHGPSJIBLGBZSZOAWRIBQHBZKNSGPSEYJMFRAEWKVHTBFRYFEVRHGPOGMHNTRLRZKNMCCHGIQMOGBNTFRUQGANLXMROSGPSJIBLANHSIHRNBKCZYQWKAUALPRMNEBVHGWPBUELGGIZIYRUPMFGUVVABPNJZRZEIARQBZYJCGPOFUPSOAXNSBVZRQBVNGMFECOTSVHUQGGIEGWGCFTWXYYGSAIHOVGBNBWANUMFBOTPCHNUWIFYFWTFIZMHVFYMFFISBVRBRIJLFNVRFUQROPYABHBJNZWFNUMFRQRZSFBRTHRLRLTEIZBVRQRIHUYEBVNNIMFLXNGFHXRKOENFJSFJNBHRLRLKVNUZIFNVKAVLRABHZSMRNVBCHOSCQUFUALFBIFBSQCAJMCIHTHESJPWPBGPSSUEUSEXRIHUBNLOYLRIRLMRBOCUEBHBVRPWFNHUPECYACSNUMFRPBTIGCBVPHNGPOGQBWRZUAIBQNUIHSUEUSENUWITBGPSLQBZYHHPMOFCAOZLQBZYFCYMBGFLIBQHBWBRBRIFQNUMANMGPSLQRVHNVBCHJCGPAHZSTSQNEMOQNUMFNNUMFSIEIGZOPPOFNBMBGYEBOVHNVMFOFXWPCBVHUUGBVRSJMFRUJIYRQNAHBVRIHUYVAHVWNTOAXGZOVNBZCHMVVSAAYIBQNUMFRQNAGPUEKSYSNVOZIHVHBZBZRRLNVRCLBBSPNVWBGIWCGGCSGAHWUVOGCBVOYVBIGGCAORNLVVUOOEOZNLVMGOSNZARXZMBNHQPWTBJIMEIOJSECRAHBIXXZNWRQBGBRKOCCGIZVNFMZSYIMFLHVOVGZNUWYCRAKRLRXIOFVKZLWNCHVIAMRAIGBCTIBCHBZGWKAQVBVBOGZSZIIQBTNUMWEZHZBVNHZSGIHXVBFFBSEYEAKNLRPCHMRATBLFMQHLVBMGBRPWTBJIMZUAQBGBRLOEEJIGNWVBMGLNLSFGNVWANUMZVAUBOAXOMWAAEMQBAAQGRXNVRPBNTZRHTMROSUQGSYYTCJNEIRRMZIBJBBUVRMGWDCYQQBUCFKVNLNKHRLBNHUYPIDGUVVUNFYIBGFLAVBNUQAGBEWITBGPSUYNLOAXEWRRUJIMGBRUOVFJIGJULTOVXOGGRPRVFBVOMFFUALHUYTCOEXFPCGNUZSRXRIRNHQBVRHTWHFBBBRRUQPWZMRTTOSGPSBNUMFSIHZWAWBVGRKHMBPYBNHUYSIWYOEMCSBVAOZGHVWGCBVOSNRZKUCPPHUYZIWYQNAFBVOMRVHCMOPYGPOGGNOBVZVKSANCWHRHGIHRNUMZBLQUOLIEWTYIALCAQNAANXRBCFNNVRNHQLSYCIMFBHGCFABNUUEYRVPLIAMVVAUEOLGNVKUIQMGCIVTSQNUMWYFHAHECBCGPLRIHHLRQBFCTPHBZNTZUCFZSGCACSCLVACAYEAWAFBVRBHTICYMSWITBGJOGNYMGJCGPHUYVZHHLASSLMNVRGBRUOWYFBMBZGPSYUJNWEYQJZHHQMFOOFASFCAIABHTBVRGYWOQYQEWGBEWIAXFWTFBBBOAXOIZYNUQSIYFABVJCMRBZSLWNGBVRPLBAGRMSZCZNUMBRWXACSHBJZRFBZRFUGKCHLGLFNQVVUEIBUGZOFSSGYRZGJYABWANBAHTCYMGFNBASNLPPTBLPWBGLNJOAXTWCQMNVRGBRUCOZVZSQIABVRGHAYRNRMFFUALHUYZCGXYGMSEMSQFRXBVHUYZWPNHQVCOIQGHUIHOVGUAGCSNUMGRIPKIELRVQRMZCQUIHBCSNUMQBGZWBJULQBGBRUWQMGWTGBRUHUYUIBTGNVSIYEJIFSNVRRPRZKBLFMHUUACGRFRAGJUFQBPIAAHNHGZSDOVAWGCBVBBQFBFVHTQBTOCTCAAEWKFISUWFWRTZNHRWIFWEQAVHNTGAIJPOAAVVUNBBCGRVEMOXYEWBFUGCFQULEVBBNLPRYABOXYAWBGORARNSAWKOOEVWAACMCCFRQBGBRPOAXNBBRQTIHRVLBVRXBHSAUALBBQOCFACAODNGCPZRNFIHGBRLCBLBNKRMGUWAMGMFUUYTHBXNGHNEVVUGBRTWSYBNOAUGZCPCBCGZOELSEYEIBQNBUCELBECSUJZSGWUMRCCYNSEYEEVBBNLFBVOMRNZNZARLFJCLISAWKJRVQRUYTHUYFMHUCAOGNHQIHUIHAOAXYQYRNUMAPUZMHBJNAGVHNVRPFBASHJBVHUYQMOEIYLMRUEWBRNUWIFUALGRPRVVHHQZSQUALGRPRVHLZVDSRHIQFBHRLPLNUMAJBVTSGBRECBXZIBNHQBVRZNZARLJWFXYQCBUYRLSQNUWGRNJWCSNUMZNLTMXNQFIBQNUWGRIGPSENJWCSNUMDYUVVOAXGPSSUVZTNWRAHEIQEWGBFBWEYAWITBNVRPUEZWRXGPSVLQQJVHRZWTBGAKVNUIVVAUPOAXGPIFXVLHUYLMOEIAMHUIHAOAXFMJRHUCBQLRLOAXFMJRHGGTVPRKCAXHKHGBRQFTLRIHAYFASFUALALLVIRFISAANFYKFRUGCFRMGPSPLRIHHLRACSNUQGPBEWBVWYMOZIAOHUYEMGGUYWBTNUMFBUQAHUUGTOLVRNCEYGPSZ
More ciphertexts are available at https://mathdept.byu.edu/~doud/Vigenere/.