Een van de simpelste manieren om geheime boodschappen te schrijven, is via een substitutiecijfer. Hier zet je elke letter in het alfabet om naar een vaste andere letter. Een voorbeeld van een dergelijke cijfer is ROT13, dat alle letters van het alfabet 13 posities opschuift zoals in onderstaande afbeelding:
Het woord HELLO wordt in ROT13 dus URYYB. Zo'n substitutiecijfer lijkt misschien veilig op het eerste gezicht, maar je kan dergelijke codes heel makkelijk kraken als je weet in welke taal de code geschreven is. Kijk bijvoorbeeld naar de frequentie van letters in het Engels:
We zien dat sommige letters bijna uniek te identificeren zijn puur op basis van hun frequentie in een tekst. Als de tekst lang genoeg is, kunnen we een substitutiecijfer in het Engels dus kraken door de meest frequente letter af te beelden op E, de tweede meest frequente op T, enz. Dit werkt omdat alle substitutiecijfers als grote zwakte hebben dat ze elke letter altijd op dezelfde andere letter afbeelden en zo dus de frequenties van de originele letters intact houden.
Schrijf een programma dat een tekst als invoer neemt en een tabel van letterfrequenties produceert als uitvoer. Zet hiervoor alle tekst om naar lowercase en negeer tekens die geen letter zijn uit het alfabet.
Invoer:
It is a truth universally acknowledged, that a single man in
possession of a good fortune, must be in want of a wife.
Uitvoer:
{'i': 8, 't': 8, 's': 8, 'a': 9, 'r': 3, 'u': 4, 'h': 2, 'n': 9, 'v': 1, 'e': 8, 'l': 4, 'y': 1, 'c': 1, 'k': 1, 'o': 8, 'w': 3, 'd': 3, 'g': 3, 'm': 2, 'p': 1, 'f': 4, 'b': 1}