︠59f51040-192b-4220-992b-e5981cc29e8f︠ cipher = "OHNCCIBEDDYKXWFFDYIEGHFFCDODYFIQRXDXDMHWBWFDBPGXEDWYSINXTRFIYIQTBFNDXFIWYQTFCDSXDIFDBFSDYWHBDBWYFCWBIXFIBWYDJDXTGFCDXRGBBDBBIMHIQWFTGPWYFDQQDNFFCIFUDPWDBUDPWYWFWGYIYUOTBFWPWDBOGXDIJDXISDOWYUBEHFFCGHSCQDBBDXBGHQBNIYYGFCGRDFGDMHIQEDDFCGJDYGXOWNCDQIYSDQGFCDTYDDUYGFFCDXDPGXDUDNQWYDFGKCWBFQDFCDQIFDBFFHYDGXFGFGHNCIRDYNWQFCDDIXYDBFBFHUDYFWBNIRIEQDGPQDIXYWYSFCDXHQDBIYUIBIYIOIFDHXGPDYZGTWYSCWBINCWDJDODYF" ︡65cefb70-25ee-4b12-9a5d-fcb44e805ba1︡︡ ︠5b10ad2d-ebb3-4472-b765-1c80fa064499︠ len(cipher) ︡1fe53bb1-cff1-4a43-ae76-506768c27ffb︡{"stdout": "398"}︡ ︠6cd786ac-f144-42f0-bdf6-556a9bf81482︠ key = dict() ︡8b6471b1-8478-4847-affa-8c966c1914b4︡︡ ︠ad79b136-7c34-4bb5-9d9b-2ac775c4a5cc︠ for i in range(26): key[chr(ord('A')+i)]= chr(ord('A')+i) ︡1675700a-62f7-4e86-9df2-6645548e83e3︡︡ ︠fe98654f-9e33-40e5-9845-d05dcbd4a295︠ sage: def apply_key(cipher_text,cipher_key): ... plain_text = "" ... for ch in cipher_text: ... plain_text += cipher_key[ch] ... return plain_text ︡31a37187-ee73-4a0a-a5bd-77a9f178d886︡︡ ︠70c85544-abdb-4d68-9838-1cef67ac147a︠ sage: def list_cmp(x,y): ... if x[1]y[1]: ... return int(-1) ... return int(0) ︡8be0c9ba-867c-4ed7-a480-bce0d4160608︡︡ ︠8979b62d-e2fa-4faf-bb63-6b9fe6be1317︠ sage: #Based on most common letter sage: key['D'] = 'e' sage: #Based on most common digraph sage: key['C'] = 'h' sage: key['F'] = 't' sage: #Based on most common digraph not containing eth sage: key['W'] = 'i' sage: key['Y'] = 'n' sage: #Based on most common remaining letter sage: key['I'] = 'a' sage: #Based on common letter with lots of doubles occurances sage: key['B'] = 's' sage: #To make the work "been" after has sage: key['E'] = 'b' sage: #To make ab__t into about sage: key['G'] = 'o' sage: key['H'] = 'u' sage: #Based on frequency and high digraph of Qe sage: key['X'] = 'r' sage: #Based on the Mu digraph frequency sage: key['M'] = 'q' sage: #To make _ritten into written sage: key['K'] = 'w' sage: #To make _rerequisites into prerequisites sage: key['R'] = 'p' sage: #To make _u_h into much sage: key['O'] = 'm' sage: key['N'] = 'c' sage: #To make _ental into mental sage: key['Q'] = 'l' sage: #To make cr_ptanal_st into cryptanalyst sage: key['T'] = 'y' sage: #To make _or into for sage: key['P'] = 'f' sage: #To make bein_ into being sage: key['S'] = 'g' sage: #To make e_ery into every sage: key['J'] = 'v' sage: #To make _efies_efinition into defies definition sage: key['U'] = 'd' sage: #To make en_oy into enjoy sage: key['Z'] = 'j' ︡569e3f17-91f2-46ea-b1f8-26c6f89652c1︡︡ ︠5b3058ab-f945-426b-b94c-1a74c5daecd4︠ sage: data = [["Letter", "Frequency", "Percentage"]] sage: for i in range(26): ... data.append([key[chr(ord('A') + i)],cipher.count(chr(ord('A') + i)),100*(0.0+cipher.count(chr(ord('A') + i)))/len(cipher) ]) ... sage: data.sort(list_cmp) sage: html.table(data) ︡39b30842-b764-4ff2-85ea-8e9facc1d6d4︡{"html": "\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LetterFrequencyPercentage
e6315.8291457286432
t4511.3065326633166
n328.04020100502512
a317.78894472361809
s297.28643216080402
i276.78391959798995
o246.03015075376884
h215.27638190954774
r215.27638190954774
l184.52261306532663
u143.51758793969849
c112.76381909547739
m82.01005025125628
f82.01005025125628
g82.01005025125628
y82.01005025125628
d82.01005025125628
b61.50753768844221
p61.50753768844221
v41.00502512562814
q30.753768844221106
w20.502512562814070
j10.251256281407035
A00.000000000000000
L00.000000000000000
V00.000000000000000
\n
\n"}︡ ︠507da647-1851-4882-854c-d7b9794a3fc7︠ sage: data = list(range(27)) sage: for i in range(27): ... data[i] = list(range(27)) ... sage: for i in range(26): ... data[0][1+i] = key[chr(ord('A') + i)] ... sage: for i in range(26): ... data[1+i][0] = key[chr(ord('A') + i)] ... ︡1634a6aa-057a-4fa1-8d2e-1b614451d098︡︡ ︠e5f2e6fc-6b85-4d29-87be-4340dd9e3cef︠ sage: for i in range(26): ... f = chr(ord('A') + i) ... for j in range(26): ... s = chr(ord('A') + j) ... if cipher.count(f+s) == 0: ... data[i+1][j+1] = " " ... else: ... data[i+1][j+1] = cipher.count(f+s) ... ... sage: html.table(data) ︡bf91304a-0553-4c9c-9186-1530ef4b151c︡{"html": "\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
0AshebtouavwLqcmflpgydVirnj
A
s 3 3271 5 211 1 3
h 19 3 3 1 4
e 10 4 42142 22334 112 189
b 3 11 1
t 1136 6424 1 1 111 3
o 1 1 5 4 11 3 1 1 51
u 1 2 2 2 2 1 1 111
a 3 24 1 121 421 136
v 4
w 1 1
L
q 3
c 41 1 2 1 11
m 2 111 1 2
f 1 2 1 4
l 1 6111 2 11 2 2
p 2 11 1 1
g 23 1 1 1
y 2 12 1 1 1
d 1 4 1 1 1
V
i 5 3 411 1 11 10
r 1 613111 1 1 2 1 2
n 5 53 4 1 1 1 4 3 3 11
j 1
\n
\n"}︡ ︠9d9788bb-3870-40c0-82e2-9da09f18237e︠ sage: apply_key(cipher,key) ︡abdf63a2-b88b-4c80-bb7e-60b8658f645c︡{"stdout": "'muchhasbeenwrittenaboutthementalprerequisitesforbeingacryptanalystcertainlythegreatestgeniusesinthisartasineveryotherpossessaqualityofintellectthatdefiesdefinitionandmystifiesmoreaveragemindsbutthoughlessersoulscannothopetoequalbeethovenormichelangelotheyneednotthereforedeclinetowhistlethelatesttuneortotouchapenciltheearneststudentiscapableoflearningtherulesandasanamateurofenjoyinghisachievement'"}︡