Skip to content

Instantly share code, notes, and snippets.

@messa
Created April 7, 2017 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save messa/32c63657237b43ff32fb5278e39b43db to your computer and use it in GitHub Desktop.
Save messa/32c63657237b43ff32fb5278e39b43db to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
ciphertext = '''
ymjwj fwj ybt ydujx tk jshwduynts: tsj ymfy bnqq
uwjajsy dtzw xnxyjw kwtr wjfinsl dtzw infwd fsi tsj ymfy bnqq
uwjajsy dtzw ltajwsrjsy. ymnx nx f ajwd nrutwyfsy qjxxts yt
wjrjgjwjxujhnfqqd ktw fyyfhpx zxnsl kwjvzjshd fsfqdxnx bmnhm
wjvznwj qtsljw ufxxflj tk yjcy ns twijw yt fhmnjaj gjyyjw wjxzqyx.
'''
alphabet = 'abcdefghijklmnopqrstuvwxyz'
def get_letter_counts(text):
counts = {c: 0 for c in alphabet}
for letter in text.lower():
if letter in alphabet:
counts[letter] += 1
return counts
assert get_letter_counts('x')['a'] == 0
assert get_letter_counts('aa')['a'] == 2
def get_letter_frequencies(text):
counts = get_letter_counts(text)
total = max(counts.values())
return {letter: count/total for letter, count in counts.items()}
english_frequencies = [0.64297,0.11746,0.21902,0.33483,1.00000,0.17541,
0.15864,0.47977,0.54842,0.01205,0.06078,0.31688,0.18942,
0.53133,0.59101,0.15187,0.00748,0.47134,0.49811,0.71296,
0.21713,0.07700,0.18580,0.01181,0.15541,0.00583]
assert len(english_frequencies) == len(alphabet)
english_frequencies = {letter: freq for letter, freq in zip(alphabet, english_frequencies)}
def rotate_text(text, offset):
return ''.join(rotate_letter(letter, offset) for letter in text)
def rotate_letter(letter, offset):
letter = letter.lower()
if letter in alphabet:
n = ord(letter) + offset
if n > ord('z'):
n -= ord('z') - ord('a') + 1
return chr(n)
else:
return letter
assert rotate_letter('a', 0) == 'a'
assert rotate_letter('a', 1) == 'b'
assert rotate_letter('z', 0) == 'z'
assert rotate_letter('z', 1) == 'a'
assert rotate_letter('z', 2) == 'b'
best_offset = 0
best_offset_distance = None
for offset in range(25):
print('-' * 80)
print('Offset:', offset)
rotated_text = rotate_text(ciphertext, offset)
print('Text:', rotated_text)
rotated_freqs = get_letter_frequencies(rotated_text)
#print(rotated_freqs)
print('Frequency distance - sum:', sum(abs(english_frequencies[letter] - rotated_freqs[letter]) for letter in alphabet))
print('Frequency distance - quadratic:', sum((english_frequencies[letter] - rotated_freqs[letter])**2 for letter in alphabet))
distance = sum((english_frequencies[letter] - rotated_freqs[letter])**2 for letter in alphabet)
if best_offset_distance is None or distance < best_offset_distance:
best_offset = offset
best_offset_distance = distance
plaintext = rotate_text(ciphertext, best_offset)
print()
print('Best plaintext:', plaintext)
--------------------------------------------------------------------------------
Offset: 0
Text:
ymjwj fwj ybt ydujx tk jshwduynts: tsj ymfy bnqq
uwjajsy dtzw xnxyjw kwtr wjfinsl dtzw infwd fsi tsj ymfy bnqq
uwjajsy dtzw ltajwsrjsy. ymnx nx f ajwd nrutwyfsy qjxxts yt
wjrjgjwjxujhnfqqd ktw fyyfhpx zxnsl kwjvzjshd fsfqdxnx bmnhm
wjvznwj qtsljw ufxxflj tk yjcy ns twijw yt fhmnjaj gjyyjw wjxzqyx.
Frequency distance - sum: 7.521892857142856
Frequency distance - quadratic: 4.1179784738551035
--------------------------------------------------------------------------------
Offset: 1
Text:
znkxk gxk zcu zevky ul ktixevzout: utk zngz corr
vxkbktz euax yoyzkx lxus xkgjotm euax jogxe gtj utk zngz corr
vxkbktz euax mubkxtsktz. znoy oy g bkxe osvuxzgtz rkyyut zu
xkskhkxkyvkiogrre lux gzzgiqy ayotm lxkwaktie gtgreyoy cnoin
xkwaoxk rutmkx vgyygmk ul zkdz ot uxjkx zu ginokbk hkzzkx xkyarzy.
Frequency distance - sum: 7.825549999999999
Frequency distance - quadratic: 3.7698087595693877
--------------------------------------------------------------------------------
Offset: 2
Text:
aolyl hyl adv afwlz vm lujyfwapvu: vul aoha dpss
wylclua fvby zpzaly myvt ylhkpun fvby kphyf huk vul aoha dpss
wylclua fvby nvclyutlua. aopz pz h clyf ptwvyahua slzzvu av
yltlilylzwljphssf mvy haahjrz bzpun mylxblujf huhsfzpz dopjo
ylxbpyl svunly whzzhnl vm alea pu vykly av hjoplcl ilaaly ylzbsaz.
Frequency distance - sum: 7.269072857142857
Frequency distance - quadratic: 3.594043045283673
--------------------------------------------------------------------------------
Offset: 3
Text:
bpmzm izm bew bgxma wn mvkzgxbqwv: wvm bpib eqtt
xzmdmvb gwcz aqabmz nzwu zmilqvo gwcz lqizg ivl wvm bpib eqtt
xzmdmvb gwcz owdmzvumvb. bpqa qa i dmzg quxwzbivb tmaawv bw
zmumjmzmaxmkqittg nwz ibbiksa caqvo nzmycmvkg ivitgaqa epqkp
zmycqzm twvomz xiaaiom wn bmfb qv wzlmz bw ikpqmdm jmbbmz zmactba.
Frequency distance - sum: 8.430735714285714
Frequency distance - quadratic: 4.222971045283674
--------------------------------------------------------------------------------
Offset: 4
Text:
cqnan jan cfx chynb xo nwlahycrxw: xwn cqjc fruu
yanenwc hxda brbcna oaxv anjmrwp hxda mrjah jwm xwn cqjc fruu
yanenwc hxda pxenawvnwc. cqrb rb j enah rvyxacjwc unbbxw cx
anvnknanbynlrjuuh oxa jccjltb dbrwp oanzdnwlh jwjuhbrb fqrlq
anzdran uxwpna yjbbjpn xo cngc rw xamna cx jlqrnen knccna anbducb.
Frequency distance - sum: 6.820435714285715
Frequency distance - quadratic: 3.207523045283674
--------------------------------------------------------------------------------
Offset: 5
Text:
drobo kbo dgy dizoc yp oxmbizdsyx: yxo drkd gsvv
zbofoxd iyeb cscdob pbyw boknsxq iyeb nskbi kxn yxo drkd gsvv
zbofoxd iyeb qyfobxwoxd. drsc sc k fobi swzybdkxd voccyx dy
bowoloboczomskvvi pyb kddkmuc ecsxq pboaeoxmi kxkvicsc grsmr
boaesbo vyxqob zkcckqo yp dohd sx ybnob dy kmrsofo loddob bocevdc.
Frequency distance - sum: 7.568612857142858
Frequency distance - quadratic: 3.4733264738551024
--------------------------------------------------------------------------------
Offset: 6
Text:
espcp lcp ehz ejapd zq pyncjaetzy: zyp esle htww
acpgpye jzfc dtdepc qczx cplotyr jzfc otlcj lyo zyp esle htww
acpgpye jzfc rzgpcyxpye. estd td l gpcj txazcelye wpddzy ez
cpxpmpcpdapntlwwj qzc leelnvd fdtyr qcpbfpynj lylwjdtd hstns
cpbftcp wzyrpc alddlrp zq epie ty zcopc ez lnstpgp mpeepc cpdfwed.
Frequency distance - sum: 7.005664285714287
Frequency distance - quadratic: 2.9026967595693884
--------------------------------------------------------------------------------
Offset: 7
Text:
ftqdq mdq fia fkbqe ar qzodkbfuaz: azq ftmf iuxx
bdqhqzf kagd euefqd rday dqmpuzs kagd pumdk mzp azq ftmf iuxx
bdqhqzf kagd sahqdzyqzf. ftue ue m hqdk uybadfmzf xqeeaz fa
dqyqnqdqebqoumxxk rad mffmowe geuzs rdqcgqzok mzmxkeue ituot
dqcgudq xazsqd bmeemsq ar fqjf uz adpqd fa motuqhq nqffqd dqegxfe.
Frequency distance - sum: 7.862478571428572
Frequency distance - quadratic: 3.577721330997959
--------------------------------------------------------------------------------
Offset: 8
Text:
gurer ner gjb glcrf bs rapelcgvba: bar gung jvyy
cerirag lbhe fvfgre sebz ernqvat lbhe qvnel naq bar gung jvyy
cerirag lbhe tbireazrag. guvf vf n irel vzcbegnag yrffba gb
erzrorerfcrpvnyyl sbe nggnpxf hfvat serdhrapl nanylfvf juvpu
erdhver ybatre cnffntr bs grkg va beqre gb npuvrir orggre erfhygf.
Frequency distance - sum: 5.984130000000002
Frequency distance - quadratic: 2.2154259024265306
--------------------------------------------------------------------------------
Offset: 9
Text:
hvsfs ofs hkc hmdsg ct sbqfmdhwcb: cbs hvoh kwzz
dfsjsbh mcif gwghsf tfca fsorwbu mcif rwofm obr cbs hvoh kwzz
dfsjsbh mcif ucjsfbasbh. hvwg wg o jsfm wadcfhobh zsggcb hc
fsaspsfsgdsqwozzm tcf ohhoqyg igwbu tfseisbqm obozmgwg kvwqv
fseiwfs zcbusf doggous ct hslh wb cfrsf hc oqvwsjs pshhsf fsgizhg.
Frequency distance - sum: 7.499189999999999
Frequency distance - quadratic: 3.326054473855102
--------------------------------------------------------------------------------
Offset: 10
Text:
iwtgt pgt ild ineth du tcrgneixdc: dct iwpi lxaa
egtktci ndjg hxhitg ugdb gtpsxcv ndjg sxpgn pcs dct iwpi lxaa
egtktci ndjg vdktgcbtci. iwxh xh p ktgn xbedgipci athhdc id
gtbtqtgthetrxpaan udg piiprzh jhxcv ugtfjtcrn pcpanhxh lwxrw
gtfjxgt adcvtg ephhpvt du itmi xc dgstg id prwxtkt qtiitg gthjaih.
Frequency distance - sum: 6.042607142857142
Frequency distance - quadratic: 2.4125927595693875
--------------------------------------------------------------------------------
Offset: 11
Text:
jxuhu qhu jme jofui ev udshofjyed: edu jxqj mybb
fhuludj oekh iyijuh vhec huqtydw oekh tyqho qdt edu jxqj mybb
fhuludj oekh weluhdcudj. jxyi yi q luho ycfehjqdj buiied je
hucuruhuifusyqbbo veh qjjqsai kiydw vhugkudso qdqboiyi mxysx
hugkyhu bedwuh fqiiqwu ev junj yd ehtuh je qsxyulu rujjuh huikbji.
Frequency distance - sum: 7.203041428571428
Frequency distance - quadratic: 3.2265190452836734
--------------------------------------------------------------------------------
Offset: 12
Text:
kyviv riv knf kpgvj fw vetipgkzfe: fev kyrk nzcc
givmvek pfli jzjkvi wifd ivruzex pfli uzrip reu fev kyrk nzcc
givmvek pfli xfmviedvek. kyzj zj r mvip zdgfikrek cvjjfe kf
ivdvsvivjgvtzrccp wfi rkkrtbj ljzex wivhlvetp rercpjzj nyzty
ivhlziv cfexvi grjjrxv fw kvok ze fiuvi kf rtyzvmv svkkvi ivjlckj.
Frequency distance - sum: 7.577392857142856
Frequency distance - quadratic: 3.7596739024265315
--------------------------------------------------------------------------------
Offset: 13
Text:
lzwjw sjw log lqhwk gx wfujqhlagf: gfw lzsl oadd
hjwnwfl qgmj kaklwj xjge jwsvafy qgmj vasjq sfv gfw lzsl oadd
hjwnwfl qgmj ygnwjfewfl. lzak ak s nwjq aehgjlsfl dwkkgf lg
jwewtwjwkhwuasddq xgj sllsuck mkafy xjwimwfuq sfsdqkak ozauz
jwimajw dgfywj hskksyw gx lwpl af gjvwj lg suzawnw twllwj jwkmdlk.
Frequency distance - sum: 8.041958571428571
Frequency distance - quadratic: 4.087395045283674
--------------------------------------------------------------------------------
Offset: 14
Text:
maxkx tkx mph mrixl hy xgvkrimbhg: hgx matm pbee
ikxoxgm rhnk lblmxk ykhf kxtwbgz rhnk wbtkr tgw hgx matm pbee
ikxoxgm rhnk zhoxkgfxgm. mabl bl t oxkr bfihkmtgm exllhg mh
kxfxuxkxlixvbteer yhk tmmtvdl nlbgz ykxjnxgvr tgterlbl pabva
kxjnbkx ehgzxk itlltzx hy mxqm bg hkwxk mh tvabxox uxmmxk kxlneml.
Frequency distance - sum: 7.398490000000001
Frequency distance - quadratic: 3.6256921881408157
--------------------------------------------------------------------------------
Offset: 15
Text:
nbyly uly nqi nsjym iz yhwlsjncih: ihy nbun qcff
jlypyhn siol mcmnyl zlig lyuxcha siol xculs uhx ihy nbun qcff
jlypyhn siol aipylhgyhn. nbcm cm u pyls cgjilnuhn fymmih ni
lygyvylymjywcuffs zil unnuwem omcha zlykoyhws uhufsmcm qbcwb
lykocly fihayl jummuay iz nyrn ch ilxyl ni uwbcypy vynnyl lymofnm.
Frequency distance - sum: 6.594730000000001
Frequency distance - quadratic: 3.4117150452836746
--------------------------------------------------------------------------------
Offset: 16
Text:
oczmz vmz orj otkzn ja zixmtkodji: jiz ocvo rdgg
kmzqzio tjpm ndnozm amjh mzvydib tjpm ydvmt viy jiz ocvo rdgg
kmzqzio tjpm bjqzmihzio. ocdn dn v qzmt dhkjmovio gznnji oj
mzhzwzmznkzxdvggt ajm voovxfn pndib amzlpzixt vivgtndn rcdxc
mzlpdmz gjibzm kvnnvbz ja ozso di jmyzm oj vxcdzqz wzoozm mznpgon.
Frequency distance - sum: 7.350655714285715
Frequency distance - quadratic: 3.876038473855102
--------------------------------------------------------------------------------
Offset: 17
Text:
pdana wna psk pulao kb ajynulpekj: kja pdwp sehh
lnarajp ukqn oeopan bnki nawzejc ukqn zewnu wjz kja pdwp sehh
lnarajp ukqn ckranjiajp. pdeo eo w ranu eilknpwjp haookj pk
naiaxanaolayewhhu bkn wppwygo qoejc bnamqajyu wjwhuoeo sdeyd
namqena hkjcan lwoowca kb patp ej knzan pk wydeara xappan naoqhpo.
Frequency distance - sum: 6.301461428571429
Frequency distance - quadratic: 2.388451045283674
--------------------------------------------------------------------------------
Offset: 18
Text:
qebob xob qtl qvmbp lc bkzovmqflk: lkb qexq tfii
mobsbkq vlro pfpqbo colj obxafkd vlro afxov xka lkb qexq tfii
mobsbkq vlro dlsbokjbkq. qefp fp x sbov fjmloqxkq ibpplk ql
objbybobpmbzfxiiv clo xqqxzhp rpfkd cobnrbkzv xkxivpfp tefze
obnrfob ilkdbo mxppxdb lc qbuq fk loabo ql xzefbsb ybqqbo obpriqp.
Frequency distance - sum: 8.495872857142858
Frequency distance - quadratic: 4.056658473855103
--------------------------------------------------------------------------------
Offset: 19
Text:
rfcpc ypc rum rwncq md clapwnrgml: mlc rfyr ugjj
npctclr wmsp qgqrcp dpmk pcybgle wmsp bgypw ylb mlc rfyr ugjj
npctclr wmsp emtcplkclr. rfgq gq y tcpw gknmprylr jcqqml rm
pckczcpcqncagyjjw dmp yrryaiq sqgle dpcosclaw ylyjwqgq ufgaf
pcosgpc jmlecp nyqqyec md rcvr gl mpbcp rm yafgctc zcrrcp pcqsjrq.
Frequency distance - sum: 8.05287
Frequency distance - quadratic: 3.928586473855103
--------------------------------------------------------------------------------
Offset: 20
Text:
sgdqd zqd svn sxodr ne dmbqxoshnm: nmd sgzs vhkk
oqdudms xntq rhrsdq eqnl qdzchmf xntq chzqx zmc nmd sgzs vhkk
oqdudms xntq fnudqmldms. sghr hr z udqx hlonqszms kdrrnm sn
qdldadqdrodbhzkkx enq zsszbjr trhmf eqdptdmbx zmzkxrhr vghbg
qdpthqd knmfdq ozrrzfd ne sdws hm nqcdq sn zbghdud adssdq qdrtksr.
Frequency distance - sum: 6.754481428571427
Frequency distance - quadratic: 3.3539139024265308
--------------------------------------------------------------------------------
Offset: 21
Text:
there are two types of encryption: one that will
prevent your sister from reading your diary and one that will
prevent your government. this is a very important lesson to
remeberespecially for attacks using frequency analysis which
require longer passage of text in order to achieve better results.
Frequency distance - sum: 1.951481428571429
Frequency distance - quadratic: 0.30071675956938776
--------------------------------------------------------------------------------
Offset: 22
Text:
uifsf bsf uxp uzqft pg fodszqujpo: pof uibu xjmm
qsfwfou zpvs tjtufs gspn sfbejoh zpvs ejbsz boe pof uibu xjmm
qsfwfou zpvs hpwfsonfou. uijt jt b wfsz jnqpsubou mfttpo up
sfnfcfsftqfdjbmmz gps buubdlt vtjoh gsfrvfodz bobmztjt xijdi
sfrvjsf mpohfs qbttbhf pg ufyu jo psefs up bdijfwf cfuufs sftvmut.
Frequency distance - sum: 7.745590000000001
Frequency distance - quadratic: 3.567283616712244
--------------------------------------------------------------------------------
Offset: 23
Text:
vjgtg ctg vyq vargu qh gpetarvkqp: qpg vjcv yknn
rtgxgpv aqwt ukuvgt htqo tgcfkpi aqwt fkcta cpf qpg vjcv yknn
rtgxgpv aqwt iqxgtpogpv. vjku ku c xgta korqtvcpv nguuqp vq
tgogdgtgurgekcnna hqt cvvcemu wukpi htgswgpea cpcnauku yjkej
tgswktg nqpigt rcuucig qh vgzv kp qtfgt vq cejkgxg dgvvgt tguwnvu.
Frequency distance - sum: 7.889132857142859
Frequency distance - quadratic: 3.642691045283673
--------------------------------------------------------------------------------
Offset: 24
Text:
wkhuh duh wzr wbshv ri hqfubswlrq: rqh wkdw zloo
suhyhqw brxu vlvwhu iurp uhdglqj brxu gldub dqg rqh wkdw zloo
suhyhqw brxu jryhuqphqw. wklv lv d yhub lpsruwdqw ohvvrq wr
uhphehuhvshfldoob iru dwwdfnv xvlqj iuhtxhqfb dqdobvlv zklfk
uhtxluh orqjhu sdvvdjh ri whaw lq rughu wr dfklhyh ehwwhu uhvxowv.
Frequency distance - sum: 7.6764100000000015
Frequency distance - quadratic: 3.701904759569388
Best plaintext:
there are two types of encryption: one that will
prevent your sister from reading your diary and one that will
prevent your government. this is a very important lesson to
remeberespecially for attacks using frequency analysis which
require longer passage of text in order to achieve better results.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment