HSG |
|
siehe hier
aus wikipedia:
Monoalphabetische Substitutionschiffren oder auch Monoalphabetische Ersetzungschiffren bezeichnen in der Kryptographie Formen der Textverschlüsselung, bei der ein Buchstabe/Zeichen durch einen anderen Buchstaben/ ein anderes Zeichen ersetzt wird. Es wird für jedes Zeichen des Klartextes nur ein Geheimtextzeichen verwendet.
Die Bilder und englischen Texte sind dem Buch "Be a Codebreaker!" von Gerald Jenkins und Anne Wild entnommen.
This ancient parchment gives the location of a great treasure which the writer has discovered and then has carefully hidden. The island is not named but the sketch clearly shows it to be the one to be called St.Catherine's Island. He had found a fortune, but also seems to have had more his share of bad luck. When you have broken the code you will be able to read what happened to him and exactly where the treasure was buried all those years ago.
This message was sent by a naval survey ship using an old fashioned telex machine. These machines produced their messages on long paper strips, known in the United States as 'ticker tape'. At one time telegrams were sent that way and the paper tape was cut up and pasted on to a coloured backgroung, just as happened here. Telex machines were much used by the military for sending messages in cipher and once you have broken this code you will be able to read what they discovered on St. Catherine's Island.
Folgende Texte sind eingescannt:
Text1
XGBLMZZCMKWHPSHESFOBESJBEMSWMKHPSCZGGEGCFPMWWSKY FTSMKFOSYESHTFZZSXCFECEGNHPSOSFFKWCFECEGNPGNSHGCM KWMHXGBOPGBZWFKYPGEMKUFZZSGKJFXFKWHFQSHPSHEFYQZS FWMKUOGBHPLSOHFZGKUHPSESWEMTSEYEGOOHPSAFOOFKWYGK HMKBSOZMUPHZXLSOHGCOGBHPFCHSECMTSNMZSOXGBLMZZOSS FEGYQOPFASWZMQSFYFKKGKHPSJFEESZGCHPMOYFKKGKAGMKH OSRFYHZXHGLFEWOFKFEEGLTFZZSXLMHPHPESSLFHSECFZZOHPS TMHFZGKSMOHPSNMWWZSGKSOHFKWGKHPSCZFHEGYQFHHPSHGA GCHPSCFZZFKWBOMKUFYGNAFOOZGGQWBSKGEHPXGBLMZZOSSF OHBKHSWHESSUEGLMKUGKFKFEEGLZSWUSJSPMKWHPFHHESSMO HPSSKHEFKYSHGHPSYFTSWMUBAHPSCZGGEFKWXGBLMZZCMKWN XGZWOSFYPSOHCMZZSWLMHPUGZWOMZTSEFKWJFUOGCJSFBHMC BZOFAAPMESOFKWSNSEFZWOHPSESFESFZOGOGNSYGOHZXOAMYS OFKWFOHEFKUSUESSKOHFHBSGCFKBKQKGLKUGWHPSHESFOBES MOXGBEOFKWMLMOPXGBNGESZBYQHPFKMHJEGBUPHNSNXZMCSP FOJSSKYBEOSWOMKYSMCGBKWMHFZZMKHPFHYZSFEMKUGKJGLS KMOZFKWFNGKUOHHPSJGKSOFKWOQBZZOGCHPESSBKCGEHBKFH SOLPGPFWWMSWJSCGESHPSXYGBZWESHBEKPGNSLMHPHPSMECG EHBKSSJSKSSISE
Text2
EMPLEVCEMPBJHPLJLWCHTXCBVMKPHEVCKPJHEDDYBXDLLPLLJ DHWCLEUPCBCHTIPKCHCRPTEDGBPCNEMPVDTPEMPJLWCHTJLHDI VCWWPTZYPBECGYEJEICPCLUEDBPVDRHJLPJEZBDKEMPDWTKC XIPCHVMDBPTJHRCWWPDHGCUCHTZDYHTEMPICEPBZCWWIJEMDY EKYVMEBDYGWPEMPVCQPPHEBCHVPMCTGPPHVDQPBPTCHTGWDV NPTGUCBDVNZCWWCHTJEICLIJEMRBPCEPOVJEPKPHEEMCEIPLEC BEPTEDVWPCBEMPBYGGWPMCBTWUMCTIPLECBEPTIMPHIPZDYHT CLJHRWPRDWTPHTDYGWDDHJHEMPTYLEMDIPQPBEMPBDDZDZEM PVCQPICLHDELCZPCHTIPMCTEDRDGCVNEDEMPLMJXZDBLDKPEJK GPBEDLMDBPJEYXHPOETCUCETCIHEMPIDBNVDHEJHYPTCHTIPCE WCLEKCTPEMPMDWPGJRPHDYRMEDLMJHPCEDBVMJHLJTPEMPVC QPEMPZJBLEMJHRIPLCIICLCLNPWPEDHCHTGPMJHTJECWCBRPLPC VMPLEHPOEEDCTPPXMDWPJHEMPZWDDBMDIPQPBDHVPJHLJTPEM PVCQPEMPBPICLCWCLHDEMJHRJHEMPVMPLECHTJHTPPTHDEMJHR PWLPJHEMPVCQPPOVPXEZDBEMPLNPWPEDHVDYWTMPMCQPGPPH DHPDZEMDLPIMDZDYHTEMPEBPCLYBPICLMPNJWWPTGUEMPDEMP BLICLEMPVCQPPHEBCHVPGWDIHYXIJEMRYHXDITPBEDGYBUEMPG DTUIPLMCWWHPQPBNHDIIMCEBPCWWUMCXXPHPTEMJLKPLLCRP MCLGPPHVDTPTGUDWJQPBADMHELBYEELJRHCWLDZZJVPBMKLCB EPKJL
Wir wollen uns anhand des ersten Textes einen 'funktionalen Werkzeugkasten' basteln und mit dessen Hilfe den Text entschlüsseln. Der Werkzeugkasten enthält eine englische Häufigkeitstabelle freqengl und Funktionen, um die Häufigkeit einzelner Buchstaben bzw. von Trigrammen zu bestimmen. Es ist praktisch, den zu entschlüsselnden Text in einem String g zur Verfügung zu haben. Der Schlüssel S soll Paare aus Geheimbuchstaben und zugehörigem Klartextbuchstaben verwalten. Er wird erst nach und nach entstehen. Hier soll er durch ein Dictionary dargestellt werden.
freqengl = (('E',11.2), ('A',8.5), ('R',7.6), ('I',7.5), ('O',7.2), ('T',7.0), ('N',6.7), ('S',5.7), ('L',5.5), ('C',4.5), ('U',3.6), ('D',3.4), ('P',3.2), ('M',3.0), ('H',3.0), ('G',2.5), ('B',2.1), ('F',1.8), ('Y',1.8), ('W',1.3), ('K',1.1), ('V',1.0), ('X',0.3), ('Z',0.3), ('J',0.2), ('Q',0.2)) def count(e,L): """ gibt die Häufigkeit des Vorkommens des Elements e in der Liste L zurück """ return len([y for y in L if e == y]) def qsort(L,vergleich=lambda x,y : x < y): """ gibt eine mit dem Vergleichsoperator vergleich sortierte Liste L zurueck """ if len(L) <= 1: return L else: kopf = L[0] rest = L[1:] links = [x for x in rest if vergleich(x,kopf)] rechts = [x for x in rest if not vergleich(x,kopf)] return qsort(links,vergleich) + [ kopf ] + qsort(rechts,vergleich) def frequency(G): """ gibt eine nach der Haeufigkeit geordnete Liste der in G (string) vorkommenden Buchstaben zurueck """ L = list(G) n = len(L) M = set(L) # Menge der vorkommenden Buchstaben return qsort([(b,count(b,L)/n) for b in M],lambda x,y : x[1] > y[1]) def trigramm(L): """ gibt eine nach der Häufigkeit geordnete Liste von Paaren (Trigramm,rel. H.) zu den in der Liste L gefundenen Trigrammen zurück """ L = list(L) triListe = list(zip(L, L[1:], L[2:])) n = len(triListe) triMenge = set(triListe) return qsort([(t,count(t,triListe)/n) for t in triMenge],lambda x,y : x[1] > y[1]) def decrypt(G,S): """ Der Geheimtext G (string) wird mit Hilfe des Schluessels S (dict {'G':'K',..}) entschluesselt. Unbekannte Buchstaben werden mit '-' dargestellt. """ return ''.join([S.get(x,'-') for x in G]) def decrypt1(G,S): """ Der Geheimtext G (string) wird mit Hilfe des Schluessels S (dict {'G':'K',..}) entschluesselt. Unbekannte Buchstaben werden unverändert aber klein dargestellt. """ if len(G) == 0: return '' else: kopf = G[0] rest = G[1:] if kopf in S: return S.get(kopf) + decrypt1(rest,S) else: return kopf.lower() + decrypt1(rest,S)
Zuerst lässt man sich eine Liste der Häufigkeiten erstellen, am besten gleich im Vergleich zu den Häufigkeiten in der englischen Sprache.
>>> f = zip(frequency(g),freqengl) >>> for x in f: print(x) (('S', 0.12471655328798185), ('E', 11.2)) (('H', 0.08503401360544217), ('A', 8.5)) (('F', 0.08390022675736962), ('R', 7.6)) (('G', 0.0782312925170068), ('I', 7.5)) (('K', 0.07482993197278912), ('O', 7.2)) (('E', 0.06235827664399093), ('T', 7.0)) (('O', 0.06235827664399093), ('N', 6.7)) (('Z', 0.05895691609977324), ('S', 5.7)) (('M', 0.05782312925170068), ('L', 5.5)) (('P', 0.05328798185941043), ('C', 4.5)) (('W', 0.046485260770975055), ('U', 3.6)) (('B', 0.036281179138321996), ('D', 3.4)) (('C', 0.031746031746031744), ('P', 3.2)) (('Y', 0.024943310657596373), ('M', 3.0)) (('L', 0.02040816326530612), ('H', 3.0)) (('U', 0.01927437641723356), ('G', 2.5)) (('X', 0.018140589569160998), ('B', 2.1)) (('N', 0.015873015873015872), ('F', 1.8)) (('J', 0.013605442176870748), ('Y', 1.8)) (('A', 0.01020408163265306), ('W', 1.3)) (('Q', 0.01020408163265306), ('K', 1.1)) (('T', 0.009070294784580499), ('V', 1.0)) (('I', 0.0011337868480725624), ('X', 0.3)) (('R', 0.0011337868480725624), ('Z', 0.3))
Man sieht, dass vermutlich das 'S' für das 'E' steht. Dies führt zu einem ersten Eintrag im Schlüssel S.
>>> S = {'S':'E'}
Die folgenden Buchstaben liegen in ihrer Häufigkeit so weit zusammen, dass man vielleicht erst weitere Informationen zusammentragen soll. Das kann über die häufigsten Trigramme geschehen.
>>> trigramm(g)[:3] [(('H', 'P', 'S'), 0.022727272727272728), (('F', 'K', 'W'), 0.013636363636363636), (('X', 'G', 'B'), 0.007954545454545454)]
Das klar häufigste Trigramm ist 'HPS'. Es steht ziemlich sicher für 'THE'. Eine Internet-Recherche nach 'trigrams english' ergibt, dass 'AND' das zweithäufigste Trigramm im Englischen ist. Der Schlüssel S sieht dann so aus.
>>> S = {'S':'E', 'H':'T', 'P':'H', 'F':'A', 'K':'N', 'W':'D'}
Ein erster Deciffrierversuch führt zu
>>> decrypt(g,S) '---------NDTHET-EA---E----ED-NTHE-------AH-DDEN-A-E-NA-E--ET-A--E--A-----THE-EAAND-A-----H--ET---ND-T----H---DAN-H ---N-A--E-N-A-ANDTA-ETHET-A---EAD-N----TH-E-TA--N-THE-ED---E------THE-A--AND--NT-N-E----HT---E-T-----THA-TE----E--- E---------EEA-----HA-ED---EA-ANN-NTHE-A--E---TH---ANN-N---NT-E-A-T--T--A-D-ANA-----A--E---THTH-EE-ATE--A---THE--TA- -NE--THE--DD-E-NE-TAND-NTHE--AT----ATTHET----THE-A--AND---N-A----A------D-EN--TH--------EEA-T-NTEDT-EE-----N--NANA- ----ED-E-EH-NDTHATT-EE--THEENT-AN-ET-THE-A-ED----THE-----AND---------ND----D-EA-HE-T----ED--TH---D----E-AND-A-----E A-T-----A--H--E-ANDE-E-A-D-THE-EA-EA------E---T------E-ANDA-T-AN-E--EEN-TAT-E--AN-N-N--N--DTHET-EA---E-------AND--- -H------E----THAN-T-----HT-E-----EHA--EEN----ED--N-E----ND-TA---NTHAT--EA--N--N---EN---ANDA--N--TTHE--NE-AND------- -TH-EE-N---T-NATE--H-HADD-ED-E---ETHE-----D-ET--NH--E--THTHE-----T-NEE-ENEE-E-'
Der Blick fällt mitten in der ersten Zeile auf 'H-DDEN'. Hier scheint das Wort 'HIDDEN' zu stehen. Um den Schlüssel zu erweitern, müsste man den Geheimbuchstaben kennen, der hinter dem 'H' kommt kennen. Für diesen Zweck gibt es die Funktion decrypt1.
>>> decrypt1(g,S)[:70] 'xgblmzzcmNDTHETeEAobeEjbemEDmNTHEczggegcAHmDDENyAtEmNAoEyeETtAzzExcAec'
Der Schlüssel wird also um das Paar 'M':'I' erweitert. Jetzt sieht der teilentschlüsselte Text so aus:
>>> decrypt(g,S) '----I---INDTHET-EA---E---IEDINTHE-------AHIDDEN-A-EINA-E--ET-A--E--A-----THE-EAAND-A-----H--ET--INDIT----H---DAN-H --IN-A--E-N-A-ANDTA-ETHET-A---EADIN----TH-E-TA--N-THE-ED-I-E------THE-A--AND--NTIN-E--I-HT---E-T-----THA-TE--I-E-I- E-----I---EEA-----HA-ED-I-EA-ANN-NTHE-A--E---THI--ANN-N--INT-E-A-T--T--A-D-ANA-----A--E--ITHTH-EE-ATE--A---THE-ITA- -NEI-THE-IDD-E-NE-TAND-NTHE--AT----ATTHET----THE-A--AND--IN-A----A------D-EN--TH----I---EEA-T-NTEDT-EE----IN--NANA- ----ED-E-EHINDTHATT-EEI-THEENT-AN-ET-THE-A-EDI---THE-----AND----I---IND----D-EA-HE-T-I--ED-ITH---D-I--E-AND-A-----E A-TI----A--HI-E-ANDE-E-A-D-THE-EA-EA------E---T----I-E-ANDA-T-AN-E--EEN-TAT-E--AN-N-N--N--DTHET-EA---EI------ANDI-I -H------E----THANIT-----HT-E---I-EHA--EEN----ED-IN-EI---NDITA--INTHAT--EA-IN--N---ENI--ANDA--N--TTHE--NE-AND------- -TH-EE-N---T-NATE--H-HADDIED-E---ETHE-----D-ET--NH--E-ITHTHEI----T-NEE-ENEE-E-'
Etwa in der Mitte des Textes findet man '----ED-E-EHINDTHATT-EEI'. Das Wort vor 'THAT' könnte 'BEHIND' sein. Dem Klartext 'B' entspräche alse geheim 'J' wie man mit Hilfe von decrypt1 ermittelt.
>>> decrypt(g,S) '----I---INDTHET-EA---EB--IEDINTHE-------AHIDDEN-A-EINA-E--ET-A--E--A-----THE-EAAND-A-----H--ET--INDIT----H---DAN-H --IN-A--E-NBA-ANDTA-ETHET-A---EADIN----TH-E-TA--N-THE-ED-I-E------THE-A--AND--NTIN-E--I-HT---E-T-----THA-TE--I-E-I- E-----I---EEA-----HA-ED-I-EA-ANN-NTHEBA--E---THI--ANN-N--INT-E-A-T--T--A-D-ANA-----A--E--ITHTH-EE-ATE--A---THE-ITA- -NEI-THE-IDD-E-NE-TAND-NTHE--AT----ATTHET----THE-A--AND--IN-A----A------D-EN--TH----I---EEA-T-NTEDT-EE----IN--NANA- ----ED-EBEHINDTHATT-EEI-THEENT-AN-ET-THE-A-EDI---THE-----AND----I---IND----D-EA-HE-T-I--ED-ITH---D-I--E-ANDBA----BE A-TI----A--HI-E-ANDE-E-A-D-THE-EA-EA------E---T----I-E-ANDA-T-AN-E--EEN-TAT-E--AN-N-N--N--DTHET-EA---EI------ANDI-I -H------E----THANITB----HT-E---I-EHA-BEEN----ED-IN-EI---NDITA--INTHAT--EA-IN--NB--ENI--ANDA--N--TTHEB-NE-AND------- -TH-EE-N---T-NATE--H-HADDIEDBE---ETHE-----D-ET--NH--E-ITHTHEI----T-NEEBENEE-E-'
Hinter 'ITHTH-EE-' aus der dritten Zeile könnte man das Zahlwort 'THREE' vermuten. Das führt zu 'E':'R'.
>>> decrypt(g,S) '----I---INDTHETREA--REB-RIEDINTHE----R--AHIDDEN-A-EINA-E-RET-A--E--AR-R--THE-EAAND-AR-R--H--ET--INDIT----H---DAN-H -RIN-A--E-NBA-ANDTA-ETHETRA---EADIN----TH-E-TA--N-THEREDRI-ER-R---THE-A--AND--NTIN-E--I-HT---E-T-----THA-TER-I-E-I- E-----I---EEAR----HA-ED-I-EA-ANN-NTHEBARRE---THI--ANN-N--INT-E-A-T--T--ARD-ANARR---A--E--ITHTHREE-ATER-A---THE-ITA- -NEI-THE-IDD-E-NE-TAND-NTHE--ATR---ATTHET----THE-A--AND--IN-A----A------D-EN-RTH----I---EEA-T-NTEDTREE-R--IN--NANAR R---ED-EBEHINDTHATTREEI-THEENTRAN-ET-THE-A-EDI---THE----RAND----I---IND----D-EA-HE-T-I--ED-ITH---D-I--ERANDBA----BE A-TI----A--HIRE-ANDE-ERA-D-THEREAREA------E---T----I-E-ANDA-TRAN-E-REEN-TAT-E--AN-N-N--N--DTHETREA--REI----R-ANDI-I -H-----RE----THANITBR---HT-E---I-EHA-BEEN--R-ED-IN-EI---NDITA--INTHAT--EARIN--NB--ENI--ANDA--N--TTHEB-NE-AND------- -THREE-N--RT-NATE--H-HADDIEDBE--RETHE-----DRET-RNH--E-ITHTHEIR--RT-NEEBENEE-ER'
Jetzt drängt sich gleich in der ersten Zeile bei 'INDTHETREA--REB-RIEDINTHE' das Wort 'TREASURE' auf. decrypt1 ergibt 'INDTHETREAobREBbRIEDINTHE', also die Paare 'O':'S', 'B':'U'.
>>> decrypt(g,S) '--U-I---INDTHETREASUREBURIEDINTHE----R--AHIDDEN-A-EINASE-RET-A--E--AR-R--THESEAAND-AR-R--H--ET--INDIT--USH-U-DAN-H -RIN-A--E-NBA-ANDTA-ETHETRA---EADIN-S-UTH-ESTA--N-THEREDRI-ER-R-SSTHE-ASSAND--NTINUES-I-HT---EST--S-UTHA-TER-I-E-I- ES--U-I--SEEAR---SHA-ED-I-EA-ANN-NTHEBARRE---THIS-ANN-N--INTSE-A-T--T--ARDSANARR---A--E--ITHTHREE-ATER-A--STHE-ITA- -NEISTHE-IDD-E-NESTAND-NTHE--ATR---ATTHET----THE-A--ANDUSIN-A----ASS----DUEN-RTH--U-I--SEEASTUNTEDTREE-R--IN--NANAR R---ED-EBEHINDTHATTREEISTHEENTRAN-ET-THE-A-EDI-U-THE----RAND--U-I---IND----DSEA-HEST-I--ED-ITH---DSI--ERANDBA-S--BE AUTI-U-SA--HIRESANDE-ERA-DSTHEREAREA-S-S--E--ST--S-I-ESANDASTRAN-E-REENSTATUE--ANUN-N--N--DTHETREASUREIS--URSANDI-I SH--U--RE-U--THANITBR-U-HT-E---I-EHASBEEN-URSEDSIN-EI--UNDITA--INTHAT--EARIN--NB--ENIS-ANDA--N-STTHEB-NESANDS-U--S- -THREEUN--RTUNATES-H-HADDIEDBE--RETHE---U-DRETURNH--E-ITHTHEIR--RTUNEEBENEE-ER'
In der 5.Zeile liest man 'BEHINDTHATTREEISTHEENTRAN-E'. Damit hat man 'Y':'C'. In der zweiten Zeile steht 'ANDygNTINUES'. Hier vermutet man 'Y':'C', 'G':'O'. In der letzten Zeile steht 'THREEUNcgRTUNATES'. Das Führt zu 'C':'F', 'G':'O'.
>>> decrypt(g,S) '-OU-I--FINDTHETREASUREBURIEDINTHEF-OOROFAHIDDENCA-EINASECRET-A--E-FARFRO-THESEAANDFARFRO-HO-ETOFINDIT-OUSHOU-DANCH ORIN-A--EONBA-ANDTA-ETHETRAC--EADIN-SOUTH-ESTA-ON-THEREDRI-ERCROSSTHE-ASSANDCONTINUES-I-HT---ESTOFSOUTHAFTERFI-E-I- ES-OU-I--SEEAROC-SHA-ED-I-EACANNONTHEBARRE-OFTHISCANNON-OINTSE-ACT--TO-ARDSANARRO--A--E--ITHTHREE-ATERFA--STHE-ITA- ONEISTHE-IDD-EONESTANDONTHEF-ATROC-ATTHETO-OFTHEFA--ANDUSIN-ACO--ASS-OO-DUENORTH-OU-I--SEEASTUNTEDTREE-RO-IN-ONANAR RO--ED-EBEHINDTHATTREEISTHEENTRANCETOTHECA-EDI-U-THEF-OORAND-OU-I--FIND--O-DSEACHESTFI--ED-ITH-O-DSI--ERANDBA-SOFBE AUTIFU-SA--HIRESANDE-ERA-DSTHEREAREA-SOSO-ECOST--S-ICESANDASTRAN-E-REENSTATUEOFANUN-NO-N-ODTHETREASUREIS-OURSANDI-I SH-OU-ORE-UC-THANITBROU-HT-E---IFEHASBEENCURSEDSINCEIFOUNDITA--INTHATC-EARIN-ONBO-ENIS-ANDA-ON-STTHEBONESANDS-U--SO FTHREEUNFORTUNATES-HOHADDIEDBEFORETHE-COU-DRETURNHO-E-ITHTHEIRFORTUNEEBENEE-ER'
Erste Zeile 'FARFROnTHESEAANDFARFROn' ergibt 'N':'M', dritte Zeile 'ACANNONTHEBARREzOFTHISCANNON' ergibt 'Z':'L'
Erste Zeile 'xOUlILLFINDTHETREASURE' ergibt 'X':'Y', 'L':'W'.
>>> decrypt(g,S) 'YOUWILLFINDTHETREASUREBURIEDINTHEFLOOROFAHIDDENCA-EINASECRET-ALLEYFARFROMTHESEAANDFARFROMHOMETOFINDITYOUSHOULDANCH ORIN-ALLEONBAYANDTA-ETHETRAC-LEADIN-SOUTHWESTALON-THEREDRI-ERCROSSTHE-ASSANDCONTINUESLI-HTLYWESTOFSOUTHAFTERFI-EMIL ESYOUWILLSEEAROC-SHA-EDLI-EACANNONTHEBARRELOFTHISCANNON-OINTSE-ACTLYTOWARDSANARROW-ALLEYWITHTHREEWATERFALLSTHE-ITAL ONEISTHEMIDDLEONESTANDONTHEFLATROC-ATTHETO-OFTHEFALLANDUSIN-ACOM-ASSLOO-DUENORTHYOUWILLSEEASTUNTEDTREE-ROWIN-ONANAR ROWLED-EBEHINDTHATTREEISTHEENTRANCETOTHECA-EDI-U-THEFLOORANDYOUWILLFINDMYOLDSEACHESTFILLEDWITH-OLDSIL-ERANDBA-SOFBE AUTIFULSA--HIRESANDEMERALDSTHEREAREALSOSOMECOSTLYS-ICESANDASTRAN-E-REENSTATUEOFANUN-NOWN-ODTHETREASUREISYOURSANDIWI SHYOUMORELUC-THANITBROU-HTMEMYLIFEHASBEENCURSEDSINCEIFOUNDITALLINTHATCLEARIN-ONBOWENISLANDAMON-STTHEBONESANDS-ULLSO FTHREEUNFORTUNATESWHOHADDIEDBEFORETHEYCOULDRETURNHOMEWITHTHEIRFORTUNEEBENEE-ER'
Erste Zeile 'HIDDENCAtEINASECRETtALLEY' führt zu 'T':'V'. Gegen Schluss 'I WISH YOU MORE LUCq THAN IT BROUuHT ME MY LIFE' ergibt 'Q':'K', 'U':'G'.
>>> decrypt(g,S) 'YOUWILLFINDTHETREASUREBURIEDINTHEFLOOROFAHIDDENCAVEINASECRETVALLEYFARFROMTHESEAANDFARFROMHOMETOFINDITYOUSHOULDANCH ORINGALLEONBAYANDTAKETHETRACKLEADINGSOUTHWESTALONGTHEREDRIVERCROSSTHE-ASSANDCONTINUESLIGHTLYWESTOFSOUTHAFTERFIVEMIL ESYOUWILLSEEAROCKSHA-EDLIKEACANNONTHEBARRELOFTHISCANNON-OINTSE-ACTLYTOWARDSANARROWVALLEYWITHTHREEWATERFALLSTHEVITAL ONEISTHEMIDDLEONESTANDONTHEFLATROCKATTHETO-OFTHEFALLANDUSINGACOM-ASSLOOKDUENORTHYOUWILLSEEASTUNTEDTREEGROWINGONANAR ROWLEDGEBEHINDTHATTREEISTHEENTRANCETOTHECAVEDIGU-THEFLOORANDYOUWILLFINDMYOLDSEACHESTFILLEDWITHGOLDSILVERANDBAGSOFBE AUTIFULSA--HIRESANDEMERALDSTHEREAREALSOSOMECOSTLYS-ICESANDASTRANGEGREENSTATUEOFANUNKNOWNGODTHETREASUREISYOURSANDIWI SHYOUMORELUCKTHANITBROUGHTMEMYLIFEHASBEENCURSEDSINCEIFOUNDITALLINTHATCLEARINGONBOWENISLANDAMONGSTTHEBONESANDSKULLSO FTHREEUNFORTUNATESWHOHADDIEDBEFORETHEYCOULDRETURNHOMEWITHTHEIRFORTUNEEBENEE-ER'
Viertletzte Zeile 'FILLED WITH GOLD SILVER AND BAGS OF BEAUTIFUL SAaaHIRES' führt auf 'A':'P'. Dass man im Englischen Saphir mit zwei 'p' schreibt lernt man hier gleich zusätzlich.
>>> decrypt(g,S) 'YOUWILLFINDTHETREASUREBURIEDINTHEFLOOROFAHIDDENCAVEINASECRETVALLEYFARFROMTHESEAANDFARFROMHOMETOFINDITYOUSHOULDANCH ORINGALLEONBAYANDTAKETHETRACKLEADINGSOUTHWESTALONGTHEREDRIVERCROSSTHEPASSANDCONTINUESLIGHTLYWESTOFSOUTHAFTERFIVEMIL ESYOUWILLSEEAROCKSHAPEDLIKEACANNONTHEBARRELOFTHISCANNONPOINTSE-ACTLYTOWARDSANARROWVALLEYWITHTHREEWATERFALLSTHEVITAL ONEISTHEMIDDLEONESTANDONTHEFLATROCKATTHETOPOFTHEFALLANDUSINGACOMPASSLOOKDUENORTHYOUWILLSEEASTUNTEDTREEGROWINGONANAR ROWLEDGEBEHINDTHATTREEISTHEENTRANCETOTHECAVEDIGUPTHEFLOORANDYOUWILLFINDMYOLDSEACHESTFILLEDWITHGOLDSILVERANDBAGSOFBE AUTIFULSAPPHIRESANDEMERALDSTHEREAREALSOSOMECOSTLYSPICESANDASTRANGEGREENSTATUEOFANUNKNOWNGODTHETREASUREISYOURSANDIWI SHYOUMORELUCKTHANITBROUGHTMEMYLIFEHASBEENCURSEDSINCEIFOUNDITALLINTHATCLEARINGONBOWENISLANDAMONGSTTHEBONESANDSKULLSO FTHREEUNFORTUNATESWHOHADDIEDBEFORETHEYCOULDRETURNHOMEWITHTHEIRFORTUNEEBENEE-ER'
Es bleiben zwei Buchstaben: 'POINTS ErACTLY TOWARDS' lässt sich mit 'R':'X' lösen. Das letze Wort wird wohl der Name 'EBENEEZER' sein, also 'I':'Z'. Mit eingefügten Leerstellen ergibt sich schließlich:
>>> decrypt(g,S) 'YOU WILL FIND THE TREASURE BURIED IN THE FLOOR OF A HIDDEN CAVE IN A SECRET VALLEY FAR FROM THE SEA AND FAR FROM HOME TO FIND IT YOU SHOULD ANCHOR IN GALLEON BAY AND TAKE THE TRACK LEADING SOUTHWEST ALONG THE RED RIVER CROSS THE PASS AND CONTINUES LIGHTLY WEST OF SOUTH AFTER FIVE MILES YOU WILL SEE A ROCK SHAPED LIKE A CANNON THE BARREL OF THIS CANNON POINTS EXACTLY TOWARDS AN ARROW VALLEY WITH THREE WATERFALLS THE VITAL ONE IS THE MIDDLE ONE STAND ON THE FLAT ROCK AT THE TOP OF THE FALL AND USING A COMPASS LOOK DUE NORTH YOU WILL SEE A STUNTED TREE GROWING ON A NARROW LEDGE BEHIND THAT TREE IS THE ENTRANCE TO THE CAVE DIG UP THE FLOOR AND YOU WILL FIND MY OLD SEA CHEST FILLED WITH GOLD SILVER AND BAGS OF BEAUTIFUL SAPPHIRES AND EMERALDS THERE ARE ALSO SOME COSTLY SPICES AND A STRANGE GREEN STATUE OF AN UNKNOWN GOD THE TREASURE IS YOURS AND I WISH YOU MORE LUCK THAN IT BROUGHT ME MY LIFE HAS BEEN CURSED SINCE I FOUND IT ALL IN THAT CLEARING ON BOWEN ISLAND AMONGST THE BONES AND SKULLS OF THREE UNFORTUNATES WHO HAD DIED BEFORE THEY COULD RETURN HOME WITH THEIR FORTUNE EBENEEZER'
Ein interessantes Problem ist nun, wie stimmt der gefundene Schlüssel mit der im Englischen üblichen Häufigkeitsverteilung überein.
>>> k = decrypt(g,S) >>> f = zip(frequency(k),freqengl) >>> for x in f: print(x) (('E', 0.12471655328798185), ('E', 11.2)) (('T', 0.08503401360544217), ('A', 8.5)) (('A', 0.08390022675736962), ('R', 7.6)) (('O', 0.0782312925170068), ('I', 7.5)) (('N', 0.07482993197278912), ('O', 7.2)) (('S', 0.06235827664399093), ('T', 7.0)) (('R', 0.06235827664399093), ('N', 6.7)) (('L', 0.05895691609977324), ('S', 5.7)) (('I', 0.05782312925170068), ('L', 5.5)) (('H', 0.05328798185941043), ('C', 4.5)) (('D', 0.046485260770975055), ('U', 3.6)) (('U', 0.036281179138321996), ('D', 3.4)) (('F', 0.031746031746031744), ('P', 3.2)) (('C', 0.024943310657596373), ('M', 3.0)) (('W', 0.02040816326530612), ('H', 3.0)) (('G', 0.01927437641723356), ('G', 2.5)) (('Y', 0.018140589569160998), ('B', 2.1)) (('M', 0.015873015873015872), ('F', 1.8)) (('B', 0.013605442176870748), ('Y', 1.8)) (('K', 0.01020408163265306), ('W', 1.3)) (('P', 0.01020408163265306), ('K', 1.1)) (('V', 0.009070294784580499), ('V', 1.0)) (('X', 0.0011337868480725624), ('X', 0.3)) (('Z', 0.0011337868480725624), ('Z', 0.3))
Die Übereinstimmung ist nicht sehr groß, es fehlen aber auch grobe Brüche. Vielleicht sollte die verwendete Tabelle hinterfragt werden. Jedenfalls ist die Buchstabenfolge 'ETA' für die drei häufigsten englischen Buchstaben bekannt.
Entschlüssele auch den zweiten Text.
53‡‡†305))6*;4826)4‡.)4‡);806*;48†8¶60))85;1‡(;:‡*8†83(88)5*†;46(;88*96*?;8)*‡(;485);5*†2:*‡(;4956*2(5*—4)8¶8*;4069285);)6†8)4‡‡;1(‡9;48081;8:8‡1;48†85;4)485†528806*81(‡9;48;(88;4(‡?34;48)4‡;161;:188;‡?;
Obige Entschlüsselung beruht nach einem Beginn mit einer Häufigkeitsanalyse hauptsächlich auf menschlicher Intuition und den Vergleich mit bekannten englischen Wörtern. Eine Automatik müsste die Häufigkeitsverteilungen für Monogramme, Bigramme und Trigramme und die Übereinstimmungen mit einem Wörterbuch berücksichtigen. Eine gewichtete Bewertungsfunktion zusammen mit einem genetischen Algorithmus könnte ein Ansatz sein. Es ist nicht ganz uninteressant, dass Cryptool den Text anscheinend nicht automatisch entschlüsseln kann.
Schreibe nach dem Vorbild eines vorhandenen
JavaScript-Programms ein Delphi-Programm. Der Quelltext des
JavaScript-Programm ist über 'Anzeigen/Seitenquelltext' oder so ähnlich zugänglich. Zur Übertragung sollten zunächst
die Datentypen der Variablen festgelegt werden. Es ist zu bedenken, dass es in JavaScript kein Schlüsselwort
procedure gibt. Prozeduren und Funktionen werden in JavaScript jeweils duch das Schlüsselwort function
eingeleitet. Funktionen - im Sinne von Delphi - erkennt man an Rückgaben mit return (in Delphi: result := ).
Die String-Methoden indexOf und substring lassen sich in Delphi mit pos und copy ersetzen.
Über die Funktionen pos und copy kann man sich in der Hilfe informieren oder - was leicht möglich ist - sie
selbst programmieren. Unter 'siehe auch' findet man in der Hilfe Hinweise auf weitere nützliche String-Routinen.
Eine tolle Erweiterung wäre, aus einer Häufigkeitsanalyse eine automatische Vorgabe des möglichen Schlüssels zu generieren -
und zwar getrennt nach deutsch und englisch.
Das Programm kann monoalphabetisch ver- und entschlüsseln.
Der Schlüssel ist eine Tabelle, die einem Klartext-Buchstaben den Geheimtext-Buchstaben gegenüberstellt.
Die Tabelle ist reiner Text. Ein Zeichen links von einem Leerzeichen gilt als Klartext-Zeichen. Ein Zeichen
rechts von einer Leerstelle als Geheimzeichen. Zeichen, die nicht in der Tabelle gefunden werden,
werden beim Ver- oder Entschlüsseln durch ein "-" dargestellt. Der Schlüssel kann über Copy&Paste gesichert und
eingefügt werden.
Das Programm ermittelt Häufigkeiten im Geheimtext. Die Cursor-Positionen im Klar- und Geheimtext werden angezeigt. Für
englischen Geheimtext wird auf Basis der Häufigkeitsanalyse ein Schlüsselvorschlag gemacht.
monoalphabetisch.zip