Eenvoudige encryptie

Schematisch voorbeeld van een Rotatie 3 Zie deze wiki over Caesarrotatie voor meer informatie.

Doel: vervang letters

a → d
b → e
...
z → c

De zin ...

dit is een zin

... zetten we op deze manier om in volgend gecodeerd bericht

glw lv hhq clq

We delen dit probleem op in de volgende deelproblemen:

  1. Een lijst met letters (alfabet) maken
  2. Een woordenboek maken
  3. Onze zin in code omzetten door letters te vervangen

Alfabet maken

We zijn lui, dus een lijst intypen van alle mogelijke letters, dat gaan we niet doen

chr( .. ) en ord( .. )

Elk karakter heeft een getalwaarde. De letter "a" is eigenlijk karakter met nummer 97. De getalwaarde van een letter kun je bekomen door de ord-functie te gebruiken

#Kleine letters
print ord("a") #Resultaat: 97
print ord("z") #Resultaat: 122
#Andere karakters
print ord("A") #Resultaat: 65
print ord("!") #Resultaat: 33

Het tegengestelde van de ord-functie is de chr-functie. Die zet dus een getal om in een karakter.

print chr(97) #Resultaat: 'a'
print chr(122) #Resultaat: 'z'

Map

We weten nu dat de letter "a" karakterwaarde 97 en de letter "z" karakterwaarde 122 heeft.
Het bereik van karakterwaardes loopt dus van 97 tot 123.

lijst = range(97, 123)

We kunnen hier de chr-functie op toepassen via map

alfabet = map( chr, range(97, 123) )
print alfabet

Resultaat: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

Een woordenboek maken

Het alfabet waarvan we vertrekken ziet er als volgt uit

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

Het alfabet waar we naar coderen ziet er als volgt uit:

['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c']

We knippen met andere woorden het alfabet in twee stukken en verwisselen ze van plaats.

Slice

Hoe knippen we het alfabet in twee stukken? Met een slice!

alfabet = map( chr, range(97, 123) )
print alfabet[:3] #Resultaat: de eerste 3 letters (alles tot index 3)
print alfabet[3:] #Resultaat: alles vanaf index 3 (de vierde letter)

Herinnering: in een programmeertaal telt men vanaf 0, niet 1

Codeeralfabet

Hoe plakken we die twee delen terug aan elkaar? Gewoon met +

alfabet = map( chr, range(97, 123) )

alfacode = alfabet[3:] + alfabet[:3]
print alfacode

['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c']

Dictionary

alfabet = map( chr, range(97, 123) )
alfacode = alfabet[3:] + alfabet[:3]

woordenboek = dict( zip( alfabet, alfacode ) )

Bekijk de laatste regel. De zip-functie plakt de overeenkomstige waarden van alfabet en alfacode samen. Concreet:

[('a', 'd'), ('b', 'e'), ('c', 'f'), ('d', 'g'), ('e', 'h'), ('f', 'i'), ('g', 'j'), ('h', 'k'), ('i', 'l'), ('j', 'm'), ('k', 'n'), ('l', 'o'), ('m', 'p'), ('n', 'q'), ('o', 'r'), ('p', 's'), ('q', 't'), ('r', 'u'), ('s', 'v'), ('t', 'w'), ('u', 'x'), ('v', 'y'), ('w', 'z'), ('x', 'a'), ('y', 'b'), ('z', 'c')]

De dict-functie maakt daar vervolgens een dictionary van.

{'a': 'd', 'c': 'f', 'b': 'e', 'e': 'h', 'd': 'g', 'g': 'j', 'f': 'i', 'i': 'l', 'h': 'k', 'k': 'n', 'j': 'm', 'm': 'p', 'l': 'o', 'o': 'r', 'n': 'q', 'q': 't', 'p': 's', 's': 'v', 'r': 'u', 'u': 'x', 't': 'w', 'w': 'z', 'v': 'y', 'y': 'b', 'x': 'a', 'z': 'c'}

Een dictionary heeft als voordeel dat je makkelijk waarden kunt opzoeken:

alfabet = map( chr, range(97, 123) )
alfacode = alfabet[3:] + alfabet[:3]
woordenboek = dict( zip( alfabet, alfacode ) )

print woordenboek['f'] #Resultaat: 'i'

Zin coderen

alfabet = map( chr, range(97, 123) )
alfacode = alfabet[3:] + alfabet[:3]
woordenboek = dict( zip( alfabet, alfacode ) )

zin = "dit is een zin"
code = ""
for karakter in zin:
  if karakter in woordenboek:
    code = code + woordenboek[karakter]
  else:
    code = code + karakter
print code
  1. We bekijken de zin karakter per karakter
    for karakter in zin:
  2. Als het karakter in ons woordenboek staat, dan geven we de overeenkomstige codeletter terug
    if karakter in woordenboek:
  3. We houden onze gecodeerde zin bij en plakken elke stap een nieuwe (gecodeerde) letter vast
    code = code + woordenboek[karakter]
  4. We drukken onze gecodeerde zin op het scherm af
    print code

Opdrachten

  1. Breid het woordenboek uit met alle hoofdletters
  2. Schrijf een functie codeer die als argument zin meekrijgt en deze codeert
  3. Pas de functie codeer aan. Geef argumenten zin en verschuiving mee en codeer de zin met een gegeven verschuiving (in bovenstaande voorbeeld was de verschuiving 3).
  4. Schrijf een functie decodeer die als argumenten zin en verschuiving meekrijgt en die de zin decodeert met een gegeven verschuiving (dus in bovenstaand voorbeeld met verschuiving -3)
  5. Gebruik de functie decodeer om te achterhalen met welke verschuiving ik de volgende code maakte (m.a.w. breek de code!)
    "xs vsph rs cdzcggwbu usjcbrsb"