Skip to content

Instantly share code, notes, and snippets.

@lukasklein
Created October 12, 2012 18:52
Show Gist options
  • Save lukasklein/3880816 to your computer and use it in GitHub Desktop.
Save lukasklein/3880816 to your computer and use it in GitHub Desktop.
Subsitution cipher helper
import json
english_json = open('english.json', 'r').read()
frequencies_english = json.loads(english_json)
frequencies_english_sorted = []
for char in sorted(frequencies_english, key=frequencies_english.get, reverse=True):
frequencies_english_sorted.append({'char': char, 'frq': frequencies_english[char]})
f = open('chiffrat.txt', 'r')
chiffrat = f.read()
chiffrat_subs = [[c, False] for c in chiffrat]
alphabet = [chr(i) for i in range(65, 65 + 26)]
frequencies = []
for char in alphabet:
frequencies.append({
'char': char,
'abs': chiffrat.count(char),
'rel': float(chiffrat.count(char)) / len(chiffrat) * 100
})
frequencies_sorted = sorted(frequencies, key=lambda k: k['rel'], reverse=True)
for freq in frequencies_sorted:
print "\t%s & %d & %f\\\\"%(freq['char'], freq['abs'], freq['rel'])
suggestions = []
for i in range(26):
suggestions.append([frequencies_sorted[i]['char'], frequencies_english_sorted[i]['char']])
print '%s - %s'%(frequencies_sorted[i]['char'], frequencies_english_sorted[i]['char'])
pass
words = chiffrat.split(' ')
word_frequencies_s = {}
for word in words:
if len(word) < 4:
word_frequencies_s[word] = {
'word': word,
'abs': chiffrat.count(word),
'rel': float(chiffrat.count(" %s "%word)) / len(words) * 100
}
word_frequencies = []
for key, word_frequency in word_frequencies_s.items():
word_frequencies.append(word_frequency)
word_frequencies_sorted = sorted(word_frequencies, key=lambda k: k['rel'], reverse=True)
print "\nWord frequencies"
#for word in word_frequencies_sorted:
# print "%s: %f"%(word['word'], word['rel'])
suggestions = []
suggestions.append(['L', 'A'])
suggestions.append(['Y', 'B'])
suggestions.append(['X', 'C'])
suggestions.append(['E', 'D'])
suggestions.append(['I', 'E'])
suggestions.append(['V', 'F'])
suggestions.append(['O', 'G'])
suggestions.append(['B', 'H'])
suggestions.append(['M', 'I'])
suggestions.append(['K', 'J'])
suggestions.append(['S', 'K'])
suggestions.append(['W', 'L'])
suggestions.append(['F', 'M'])
suggestions.append(['T', 'N'])
suggestions.append(['H', 'O'])
suggestions.append(['A', 'P'])
suggestions.append(['D', 'Q'])
suggestions.append(['P', 'R'])
suggestions.append(['G', 'S'])
suggestions.append(['N', 'T'])
suggestions.append(['R', 'U'])
suggestions.append(['Q', 'V'])
suggestions.append(['U', 'W'])
suggestions.append(['J', 'X'])
suggestions.append(['Z', 'Y'])
suggestions.append(['C', 'Z'])
for suggestion in suggestions:
print "\t%s & %s\\\\"%(suggestion[0], suggestion[1])
substitute = len(suggestions)
#substitute = 3
for i in range(substitute):
print 'Suggestion %d: Replace %s with %s'%(i, suggestions[i][0], suggestions[i][1])
for c in chiffrat_subs:
if c[0] == suggestions[i][0] and c[1] == False:
c[0] = suggestions[i][1]
c[1] = True
html = '<div style="word-spacing:1em;">'
for c in chiffrat_subs:
if c[1]:
html += "<strong style='color:red;'>%s</strong>"%c[0]
else:
html += c[0]
html += '</div>'
f = open('res.html', 'w')
#f.write(html)
BLOYLPE XIWMTI'G OMOLTNMX XHFARNIP, VRXSRA-VMPGN RTMQIPGLW XZYIPTINMX-SMTINMX-RWNPLFMXPH-APHOPLFFIP-
ULG YLGMXLWWZ L PLNBIP GHABMGNMXLNIE VHPF HV NBI GNLTELPE GIWV-APHOPLFFMTO LWOHPMNBFMX WHOMX FLXBMTI
HV NBI NMFI; NBI TLFI ULG HTI HV BMG UBMFGMIG. VRXSRA'G PILW XWLMF NH RTMDRITIGG ULG L APHOPLFFIE
GNHXBLGNMX APHXIGG UBIPIYZ MN XHRWE "NBPHU" LT M XBMTO BIJLOPLF, PILEMTO' L PLTEHF HAIT XMPXRMN LG L
YPHSIT (ZMT) WMTI LTE L PLTEHF XWHGIE XMPXRMN LG L VRWW (ZLTO) WMTI RTNMW GMJ GRXB "WMTIG" UIPI PHRTE.
XHTGRWNMTO MNG FIFHPZ YLTSG, UBIPI NBI UBHWI NPLEMNMHT HV 1 XBMTO MTNIPAPINLNMHT ULG GNHPIE, LTE NBIT
XPHGG-XBIXSMTO MNG XRPPITN GXLTTMTOG HV NBLN ELZ'G AHWMNMXLW, IXHTHFMX, FINIHPHWHOMXLW, LGNPHWHOMXLW,
LGNPHTHFMXLW, LTE NIXBTHWHOMXLW IXXITNPMXMNMIG, MN UHRWE APHQMEI L PILEMTO HV NBI BIJLOPLF UBMXB, NH
BLOYLPE'G FMTE, XHFYMTIE NBI YIGN HV NBI GXMITNMVMX LTE HXXRWN FINBHEG VHP GAHNNMTO HTXHFMTO NPITEG.
HT FLPXB 13, NBI GNHXBLGNMX ALNNIPT GAHTNLTIHRGWZ OITIPLNIE BIJLOPLF 23, "YPILSMTO LALPN." VRXSRA NBIT
MTNIPAPINIE:
NBMG NPLEMNMHTLWWZ RTWRXSZ GMOT ULG XLGN YZ LNWLTNILT GXMITNMGN-APMIGNG GBHPNWZ YIVHPI NBI EIGNPRXNMHT
HV NBIMP XHTNMTITN LTE MG OITIPLWWZ XHTTIXNIE UMNB EILNB YZ ULNIP. HNBIP QMYPLNMHTG WMTS MN NH ILPNBDRLSIG,
NHPTLEHIG LTE GMFMWLP EMGLGNIPG, LTE NH GMXSTIGG, EIXLZ, LTE FHPYMEMNZ LG UIWW.
NBI VMPGN XHPPIWLNMHT MG UMNB NBI RTYLWLTXI YINUIIT NIXBTHWHOMXLW LXXIWIPLNMHT LTE AHWMNMXLW PINPHOPIGGMHT,
UBMXB BLG APHXIIEIE ILPNB-UMEI LN IQIP UMEITMTO ELTOIP WIQIWG GMTXI 1914 LTE IGAIXMLWWZ GMTXI 1964. NBI
YPILSMTO LALPN MG VRTELFITNLWWZ NBI GXBMCHME LTE GXBMGFLNMX FITNLW VRORI HV WLUZIP-AHWMNMXMLTG LNNIFANMTO
NH LEFMTMGNPLNI L UHPWEUMEI NIXBTHWHOZ UBHGI FIXBLTMGFG NBIZ WLXS NBI IERXLNMHT NH XHFAPIBITE LTE UBHGI
OIGNLWN NPITE NBIZ VPRGNPLNI YZ YPILSMTO LALPN MTNH HYGHWINI PITLMGGLTXI TLNMHT-GNLNIG.
UHPWE ULP MMM MG APHYLYWZ MFFMTITN LTE, XHTGMEIPMTO NBI LEQLTXIG MT XBIFMXLW YMHWHOMXLW ULPVLPI MT
XHTKRTXNMHT UMNB NBI GMXSTIGG QMYPLNMHTG HV BIJLOPLF 23, NBI RTWILGBMTO HV AWLORI HP TIPQI OLG HP YHNB MG
LG APHYLYWI LG NBIPFHTRXWILP HQIPSMWW.
OITIPLW APHOTHGMG: FLTZ FIOLEILNBG.
NBIPI MG GHFI BHAI VHP LQHMELTXI HV NBI IFIPOMTO ALNNIPT UMNB APHFAN LXNMHT HV XHPPIXN TLNRPI. APHYLYMWMNZ
HV GRXB LQHMELTXI MG J.ZC AWRG FMTRG J.ZC.
TH YWLFI.
"FZ LGG, TH YWLFI," BLOYLPE PLOIE; LTE PLAMEWZ PIAPHOPLFFIE VRXSRA NH PILE HVV NH BMF MNG XHTEITGIE
AGZXBHYMHOPLABMIG HV NBI SIZ VMORPIG MT UHPWE AHWMNMXG LTE NBI SIZ GXMITNMGNG MT XBIFHYMHWHOMXLW ULPVLPI.
{
"A": 8.16,
"B": 1.49,
"C": 2.78,
"D": 4.23,
"E": 12.70,
"F": 2.22,
"G": 2.01,
"H": 6.09,
"I": 6.96,
"J": 0.15,
"K": 0.77,
"L": 4.02,
"M": 2.40,
"N": 6.74,
"O": 7.50,
"P": 1.92,
"Q": 0.09,
"R": 5.98,
"S": 6.32,
"T": 9.05,
"U": 2.75,
"V": 0.97,
"W": 2.36,
"X": 0.15,
"Y": 1.97,
"Z": 0.07
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment