ct = "Dolu fvb dlyl h ahkwvsl huk P dhz h mpzo Pu aol Whslvgvpj aptl, Huk zpkl if zpkl vu aol liipun apkl Dl zwyhdslk aoyvbno aol vvgl huk zsptl, Vy zrpaalylk dpao thuf h jhbkhs mspw aoyvbno aol klwaoz vm Jhtiyphu mlu Tf olhya dhz ypml dpao aol qvf vm spml, Mvy P svclk fvb lclu aolu."
len(ct)
from collections import Counter
Counter(ct)
Counter(ct.upper())
#Five most frequent letters
Counter(ct.upper()).most_common(5)
The biggest (omitting the space) is L
(30 times), that means E
(the most often used letter in English) was shifted to L
... $12-5 = 7$
eng_freq = [ .082, .015, .028, .043, .127, .022, .020, .061, .070, .002, .008, .040, .024, .067, .075, .019, .001, .060, .063, .091, .028, .010, .023, .001, .020, .001]
from numpy import dot
dot(eng_freq, eng_freq)
Counter(filter(str.isalpha, ct.upper()))
sum(Counter(filter(str.isalpha, ct.upper())).values())
from string import ascii_uppercase
ascii_uppercase
counter = Counter(filter(str.isalpha, ct.upper()))
n = sum(counter.values())
freq_perc = [ counter[letter]/n for letter in ascii_uppercase]
print(freq_perc)
dot(freq_perc, eng_freq)
print(freq_perc)
from numpy import roll
roll(freq_perc, 2)
dot(roll(freq_perc, 2), eng_freq)
for shift in range(26):
print(shift, dot(roll(freq_perc, shift), eng_freq))
[dot(roll(freq_perc, shift), eng_freq) for shift in range(26)]
dot_products = [dot(roll(freq_perc, shift), eng_freq) for shift in range(26)]
def find_max(arr):
return arr.index(max(arr)) #returns first occurence
find_max(dot_products)
opkjcpcsrqtkhespzxxsjmuinieiovvryaaqaeicjnystxnemmbyzrvvvjo pwxzinqjibxzjdmjfsxnizvjiqidfzzymlxyeiljiqidfzzzaspwxcbnihe spzxxsjmuinbnijiehjzutsvrxdvmwmwkihaujharvzvgqsgfqhwtroqvsa bnijycrzzgfwpzxtxuxsrkmvtxmgorxopkxwqvsaxafzmteoquroruxcmic piirjbkwwwjyzqtavmtlopkzipeimihmzmkcvxviovvhnwlxkeiiqmxwwse wvzkmriexdnoirmwoiwcrhlzwdvlsfqrxdwtmgtiinmtxshfrgggwowlqhi xcqsdtgmzirikedtyefirzvqreppvjmwsxvijspziiwrumxizirmexcmkrr rfxzxriowvrjbkxvekiqmtmtxyihmzlchfjvbzeqoyenvuxpivrpbopwdvh jzgrsbgpjqzwqvztoqyrcxtymzkrhppadlkpmemedtgfzifropkmbxvvimz edskiiboezzlpimxepmcmognegfviiqjibxzjdmjydhrxzazswxvqnivtse imioordvvzdwawwwjyzaujqcsimvuxswrvztowhiumijuprrvadvlsfqrxd wtgcrkedvkhwrklzcvhoxvadtredtvemqtmhecmxqfirgfpjzkhhioxrpkv segtgqieppvxcmzeppvpdazwogmiicsfsvzrmmjavmtlxwxvswgsilyxcxy ixwsqcrmygvkvofzpdboigeehzfvsgyiinkbizmjxvkuqdmceoqurcjjxvv jefhzdzlteaijjjzbyzrvvvjopwxzinithcxyimqtjcvdeoqurgitymqzcs bgsncxig
orig="opkjcpcsrqtkhespzxxsjmuinieiovvryaaqaeicjnystxnemmbyzrvvvjo pwxzinqjibxzjdmjfsxnizvjiqidfzzymlxyeiljiqidfzzzaspwxcbnihe spzxxsjmuinbnijiehjzutsvrxdvmwmwkihaujharvzvgqsgfqhwtroqvsa bnijycrzzgfwpzxtxuxsrkmvtxmgorxopkxwqvsaxafzmteoquroruxcmic piirjbkwwwjyzqtavmtlopkzipeimihmzmkcvxviovvhnwlxkeiiqmxwwse wvzkmriexdnoirmwoiwcrhlzwdvlsfqrxdwtmgtiinmtxshfrgggwowlqhi xcqsdtgmzirikedtyefirzvqreppvjmwsxvijspziiwrumxizirmexcmkrr rfxzxriowvrjbkxvekiqmtmtxyihmzlchfjvbzeqoyenvuxpivrpbopwdvh jzgrsbgpjqzwqvztoqyrcxtymzkrhppadlkpmemedtgfzifropkmbxvvimz edskiiboezzlpimxepmcmognegfviiqjibxzjdmjydhrxzazswxvqnivtse imioordvvzdwawwwjyzaujqcsimvuxswrvztowhiumijuprrvadvlsfqrxd wtgcrkedvkhwrklzcvhoxvadtredtvemqtmhecmxqfirgfpjzkhhioxrpkv segtgqieppvxcmzeppvpdazwogmiicsfsvzrmmjavmtlxwxvswgsilyxcxy ixwsqcrmygvkvofzpdboigeehzfvsgyiinkbizmjxvkuqdmceoqurcjjxvv jefhzdzlteaijjjzbyzrvvvjopwxzinithcxyimqtjcvdeoqurgitymqzcs bgsncxig"
len(orig)
"".join(filter(str.isalpha, orig))
ct = "".join(filter(str.isalpha, ct))
len(ct)
ct
" "+ct
shifted = " "+ct
s = 0
for i in range(len(ct)):
if ct[i] == shifted[i]:
s += 1
print(s)
#Pythonic
shifted = " "+ct
sum(1 for i in range(len(ct)) if ct[i] == shifted[i])
sum(1 for i in range(len(ct)) if ct[i] == (" "*2+ct)[i])
sum(1 for i in range(len(ct)) if ct[i] == (" "*3+ct)[i])
[ (shift, sum(1 for i in range(len(ct)) if ct[i] == (" "*shift+ct)[i])) for shift in range(50)]
sorted([ (shift, sum(1 for i in range(len(ct)) if ct[i] == (" "*shift+ct)[i])) for shift in range(50)], key=lambda x:x[1])
sorted([ (shift, sum(1 for i in range(len(ct)) if ct[i] == (" "*shift+ct)[i])) for shift in range(50)], key=lambda x:x[1], reverse=True)
sorted([ (shift, sum(1 for i in range(len(ct)) if ct[i] == (" "*shift+ct)[i])) for shift in range(1, 50)], key=lambda x:x[1], reverse=True)[:10]
ct
ct[::8] #decipher first letter as shift cipher
ct[1::8]