Cryptografie les 9: XOR

In de vorige les hebben we binaire getallen geleerd. In deze les gaan we die toepassen om teksten te versleutelen die geheel veilig is, zolang je een lang genoeg wachtwoord van tevoren hebt afgesproken (wat je moet doen als je dit niet van tevoren hebt kunnen afspreken leren we komende lessen).

Schakelaar

Veel lampen werken met een schakelaar met een knop waarmee je de lamp aan of uit kunt zetten. Het elektrisch schema ziet er dan uit zoals in het plaatje hieronder.

Er zijn ook lampen die je met twee knoppen aan en uit kunt zetten. Dit noem je een hotelschakelaar. Bij veel huizen kan dit bijvoorbeeld met het ganglicht op de eerste verdieping. Er zit dan een knop op de begane grond en één op de eerste verdieping.

Opdracht 1:
a) Teken hoe het elektrisch schema van een hotelschakelaar eruit ziet.

Uitwerking:

De schakelaar ziet er zo uit:

In het schema hierboven zien we dat er alleen energie loopt als beide schakelingen op 0 staat of beide schakelingen op 1. Als 0 staat voor “licht aan” en 1 voor “licht uit” krijgen we dus de samenvoegingen die hieronder te zien zijn. Als symbool voor het op deze manier samenvoegen van twee getallen gebruiken we \oplus (spreek uit: X-OR).

  • 0\oplus 0 = 0
  • 0\oplus 1 = 1
  • 1\oplus 0 = 1
  • 1\oplus 1 = 0

Bij versleutelingen gaan we dezelfde operatie gebruiken die we XOR noemen. Hierbij doen we de optelling componentsgewijs. Dat betekent dat we het eerste cijfer van het eerste getal XOR eerste cijfer van tweede getal en hetzelfde met de tweede cijfers, derde cijfers, enzovoort. Merk op dat dit alleen kan als de getallen evenveel cijfers hebben.

Opdracht 2:
a) Bereken 101\oplus 011.
b) Bereken 11010 \oplus 10100

Uitwerking a:
  • Eerste cijfer: 1\oplus 0 = 1
  • Tweede cijfer: 0\oplus 1 = 1
  • Derde cijfer: 1\oplus 1 = 0
  • In totaal krijgen we dus 101\oplus 011 = 110.

Uitwerking b:
  • Eerste cijfer: 1\oplus 1 = 0
  • Tweede cijfer: 1\oplus 0 = 1
  • Derde cijfer: 0\oplus 1 = 1
  • Vierde cijfer: 1\oplus 0 = 1
  • Vijfde cijfer: 0\oplus 0 = 0
  • In totaal krijgen we dus 11010 \oplus 10100=01110.

Vaak zullen we in praktijk ook de \oplus-operator tussen twee getallen van andere talstelsels dan binaire getallen zetten. In dat geval zet je de getallen eerst om naar binaire getallen, doe je dan XOR en zet je de getallen dan weer terug naar de getallen van het talstelsel van de oorspronkelijke getallen. Als de binaire getallen niet even lang zijn, zet je nullen voor het kortste binaire getal totdat ze wel even lang zijn.

Opdracht 3:
a) Bereken 37 \oplus 44.
b) Bereken 73 \oplus 23.

Uitwerking a:
  • 37 is binair 100101
  • 44 is binair 101100
  • 100101 \oplus 101100 = 001001
  • 1001 is in het tientallig stelsel het getal 9.

Uitwerking b:
  • 73 is binair 1001001
  • 23 is binair 0010111
  • 1001001 \oplus 0010111 = 1011110
  • 1011110 is in het tientallig stelsel het getal 64+16+8+4+2=94.

Er gebeurt iets bijzonders als je (b\oplus a)\oplus a uitrekent.

Opdracht 4:
a) Bereken (11011010\oplus 01010011)\oplus 01010011.
b) Wat is de uitkomst van (b\oplus a)\oplus a? Leg uit waarom dat altijd zo is.
c) Denk na waarom dit handig is voor het versleutelen van berichten.

Uitwerking a:

(11011010\oplus 01010011)\oplus 01010011 = [latex]10001001 \oplus 01010011 = 11011010

Uitwerking b:

Er geldt (b\oplus a)\oplus a = b. Als een cijfer in a 0 is, zal bij beide operaties er niets aan het cijfer van b veranderen.
Als een cijfer in a 1 is, zal bij beide operaties het cijfer van b veranderen. Na twee keer veranderen is die dus weer hetzelfde.

Uitwerking c:

Als wij allebei dezelfde sleutel van enen en nullen hebben, kunnen we het volgende doen:

  • Jij doet \text{versleutelde tekst}=\text{leesbare tekst} \oplus \text{sleutel}.
  • De versleutelde tekst stuur je naar mij op.
  • Ik doe \text{leesbare tekst}=\text{versleutelde tekst} \oplus \text{sleutel} om het oorspronkelijke bericht weer leesbaar te krijgen.

Cryptografie les 8: Binaire getallen

In de vorige les hebben we gezien dat het niet veilig is om iedere letter op dezelfde manier te versleutelen. We hebben dus een manier nodig hoe we letters op verschillende manieren kunnen versleutelen. In les 9 gaan we een van de belangrijke manieren hiervoor leren. Deze techniek maakt gebruik van het feit dat de computer letters en getallen opslaat als een binair getal. Daarom zullen we in deze les eerst uitgebreider naar binaire getallen kijken.

Getallenstelsels

Ik wil deze les starten met een antwoord van de Engelse onderzoekster Becky Allen op de vraag wat haar favoriete getal is:

I’m going to pick the number 10. 10 is the number that separates my youngest child who is four from my eldest who is eight, and it divides my oldest from me. You see, my youngest knows the number 10. He knows it is the one that comes after 9 and before 11. He can show it on his hands. But my oldest understands how special 10 is in our number system. She knows the 10ness of 10 and I think it is one of the most transformational things that happens around year 1 (groep 3) in the math curriculum. So, she thinks 10 is a really special number, however I know 10 is not intrinsically special and it is us as humans that have made it so.

Als je op het eind van deze les op de manier van Becky naar het getal 10 kijkt, is deze les geslaagd!

De reden dat 10 zo bijzonder voor ons voelt, is omdat wij rekenen in het decimale talstelsel (in simpeler Nederlands: tientallig stelsel). Dit betekent dat we 10 verschillende cijfers (0, 1, 2, 3, 4, 5, 6, 7, 8 en 9) hebben en dat we met de positie waarop deze cijfers staan, kunnen aangeven hoeveel we van iedere macht van 10 hebben. Zo betekent 3428 eigenlijk 3\cdot 10^3+4\cdot 10^2+2\cdot 10^1 + 8\cdot 10^0.

Er zijn volkeren geweest die vroeger met andere talstelsels gewerkt hebben, zoals een 12, 20 of 60-tallig stelsel.

Opdracht 1:
Aan wat voor dingen kun je nu nog zien dat er vroeger andere talstelsels gebruikt zijn?

Uitwerking:

Je ziet het 60-tallig stelsel bijvoorbeeld terug in dat er 60 minuten in een uur zitten en 60 seconden in een minuut. Ook bij hoeken zie je het 60-tallig stelsel terug. Op een wereldkaart is een graad nog altijd ingedeeld in 60 (graad-)minuten en een minuut weer in 60 seconden. Daarnaast komt de 360 graden van een mooi veelvoud van 60 waarbij een dag ongeveer een graad is.

Het 12-tallig stelsel zie je nog in woorden terug. Bijvoorbeeld in een dozijn (12 stuks) en een gros (een dozijn dozijnen, dus 144) en het feit dat er 24 uur in een dag zitten, heeft hier ook mee te maken (vroeger werden alleen de uren overdag geteld – toen zaten er dus 12 uren in een dag die niet allemaal even lang duurde). Ook twintig zie je nog wel in het taalgebruik terug. Zie bijvoorbeeld het Franse woord voor 80: quatre-vingts (letterlijk vier twintig

Opdracht 2:
De volgende getallen staan in het achttallig stelsel. Schrijf ze om naar het decimaal stelsel.
a) 53
b) 213
c) 1067

Uitwerking a:

53 in het achttallig stelsel is 5\cdot 8+3=43 in het decimaal stelsel.

Uitwerking b:

213 in het achttallig stelsel is 2\cdot 8^2+1\cdot 8+3=139 in het decimaal stelsel.

Uitwerking c:

1067 in het achttallig stelsel is 1\cdot 8^3+0\cdot 8^2+6\cdot 8+7=567 in het decimaal stelsel.

Opdracht 3:
De volgende getallen staan in het decimaal stelsel. Schrijf ze om naar het achttallig stelsel.
a) 42
b) 67
c) 250

Uitwerking a:

42 = 5\cdot 8+2. In het achttallig stelsel wordt het dus 52.

Uitwerking b:

67 = 1\cdot 8^2+0\cdot 8+3. In het achttallig stelsel wordt het dus 103.

Uitwerking c:

250 = 3\cdot 8^2+7\cdot 8+2. In het achttallig stelsel wordt het dus 372.

Als je een talstelsel gebruikt met meer dan 10 cijfers gebruiken we tegenwoordig vaak letters voor de volgende cijfers. Dus A=10, B=11, C=12, enzovoort. In de tabel hieronder zie je de waarde van iedere letter.

Op die manier stelt iedere naam in het 36-tallig stelsel dus ook een getal voor die je kunt omrekenen naar onze normale getallen. Zo is het getal “AB” in het 36-tallig stelsel gelijk aan 10\cdot 36^1+11=371 bij onze normale getallen. Dit, omdat de A voor 10 staat en de B voor 11 en we nu in plaats van tien 36 cijfers hebben (en dus moeten rekenen met machten van 36).

Opdracht 4:
a) Reken uit wat de naam “GIA” wordt als je die omzet van het 36-tallig stelsel naar het 10-tallig stelsel.
b) Schrijf een Python-programma dat een naam in het 36-tallig stelsel omzet naar het 10-tallig stelsel. Reken daarmee uit naar welk getal “VIVIENNE” wordt omgezet.

Uitwerking a:

De G heeft waarde 16, de I heeft waarde 18 en de A heeft waarde 10.
We krijgen dus 16\cdot 36^2+18\cdot 36+10=21394.

Uitwerking b:

De belangrijke stappen in het algoritme zijn:

  • Je moet de letters omzetten naar een getal. Eerder hebben we al gezien dat we van de ‘A’ een 0, ‘B’ een 1, ‘C’ een 2, enzovoort kunnen maken met ord(letter)-ord(“A”). Nu willen we dat ‘A’ een 10 is, ‘B’ een 11 is, enzovoort. We moeten dus om een letter om te zetten in zijn juiste waarde 10 bij dit getal optellen.
  • De waarde van de posities zijn van rechts naar links 1, 36, 36^2, 36^3, enzovoort. We moeten de waarde van de letters met die positiewaarde vermenigvuldigen. Dit kunnen we in deze volgorde doen door de letters van rechts naar links te lezen. Dat doet het onderstaande programma:
naam = "VIVIENNE"
getal = 0
for i in range(len(naam)):
    waardeletter = ord(naam[len(naam)-i-1]) - ord('A') + 10
    waardepositie = 36**i
    getal += waardeletter * waardepositie
print(getal)

Je kunt de loop ook over de letters van voor naar achter doen. Dan moet je bij iedere stap nadenken keer welke macht van 36 je moet doen. De eerste letter moet keer 36 tot de macht aantal letters min één. Iedere volgende letter moet een factor 36 minder hebben. Dit is in de code hieronder verwerkt.

naam = "VIVIENNE"
getal = 0
waarde = 36 ** (len(naam) - 1)
for letter in naam:
    getal += (ord(letter) - ord('A') + 10) * waarde
    waarde //= 36
print(getal)

De naam “VIVIENNE” wordt dus 2470376537402.
De truc van dit algoritme is dat je de waarde van iedere letter moet doen keer 36^{\text{hoeveel letters er nog komen}. Van de eerste letter is dat dus 36^{\text{aantal letters min één} en voor iedere volgende letter is dat een factor 36 minder.

Opdracht 5:
a) Ik heb ooit een T-shirt gekregen met het getal 42681699 erop (zie de afbeelding). De bedoeling van de gevers was dat dit getal omgezet moet worden naar het 36-tallig stelsel. Welke tekst staat er eigenlijk achterop mijn T-shirt?

Uitwerking:
  • We zien dat 42681699 \text{//} 36^4 = 25. De eerste letter is dus een P.
  • Er is dan nog 42681699-25\cdot 36^4 =691299 over. Er geldt 621299 \text{//} 36^3 = 14. De tweede letter is dus een E.
  • Er is dan nog 621299-14\cdot 36^3=38115 over. Er geldt 38115  \text{//} 36^2 = 29. De derde letter is dus een T.
  • Er is dan nog 38115 - 29\cdot 36^2=531 over. Er geldt 531 \text{//} 36 = 14. De vierde letter is dus een E.
  • Tot slot hebben we 531-14\cdot 36=27 over. De laatste letter is daarmee een R.

Op mijn T-shirt staat dus mijn voornaam PETER op de achterkant.

Vectoren (VWO 6 wis B)

Hier kun je een bestand downloaden met 10 examencontexten over vectoren. De uitwerkbijlage bij de opgaven Wind aan zee en Zwaartepunt kun je hier downloaden. Tips en uitwerkingen van deze contexten vind je op de volgende pagina’s:

Cryptografie les 7: Letterfrequenties

Deze les gaan we onderzoeken hoe we teksten kunnen ontcijferen waarbij iedere letter met dezelfde encryptiefunctie versleuteld is. Dit vertelt ons dat we op een andere manier teksten moeten versleutelen. Voor we daarmee van start gaan, maken we nog het CryptoHack-stuk van vorige les af.

CryptoHack

Voordat we naar het doel van de les gaan, ronden we nog een paar dingen af van vorige les aan de hand van enkele opdrachten van CryptoHack. In opdracht 1 komt de basis terug van vorige les.

Opdracht 1:
a) Maak de opdracht Modular Arithmetic 1 op CryptoHack. Je moet het kleinste antwoord van 11 \text{ mod } 6 en 8146798528947 \text{ mod } 17 geven.
b) Maak de opdracht Greatest Common Divisor op CryptoHack. Je moet de grootst gemene deler van 66528 en 52920 geven.
c) Maak de opdracht Extended gcd op CryptoHack. Je moet met het algoritme van Eulcides de u en v vinden, zodat 26513\cdot u + 32321 v = 1. Geef als antwoord de kleinste van u en v.
d) Maak de opdracht Modular Inverting op CryptoHack. Je moet dan het getal d vinden, zodat 3\cdot d \text{ mod } 13=1.

In opdracht 2 zul je zelf nog iets meer moeten nadenken.

Opdracht 2:
Maak de opdracht Modular Arithmetic 2 op CryptoHack. Je moet 273246787654^{65536} \text{ mod } 65537 berekenen.

Hint:

Bereken bij iedere keer dat je vermenigvuldigd met 273246787654 de uitkomst modulo 65537 om niet met te grote getallen te werken.

Weetje:

Lees na het beantwoorden van de vraag de pagina op CryptoHack. De stelling die hier genoemd wordt, gaan we in een latere les nog gebruiken.

Cryptografie les 6: Algoritme van Euclides

In opdracht 3 van de vorige les probeerden we decryptiefuncties te vinden bij encryptiefuncties als E(x)=(3x+5) \text{ mod } 26 en E(x)=5x \text{ mod } 26. Het doel van deze les is om een snellere manier te vinden om deze decryptiefuncties te bepalen. Hiervoor gaan we het algoritme van Euclides gebruiken. Dit is in eerste instantie een algoritme om de grootst gemene deler te bepalen, maar we gaan zien dat die ook voor andere vraagstukken nuttig is.

Delers

We beginnen met het begrip deler. We zeggen dat a een deler is van b als \frac{b}{a} een geheel getal is.

Opdracht 1:
a) Is 5 een deler van 45?
b) Is 45 een deler van 5?
c) Is 17 een deler van 17?
d) Is 1 een deler van 3?
e) Is 12 een deler van 0?
f) Is 0 een deler van 12?

Uitwerking:

a) Ja, want \frac{45}{5}=9 en dat is geheel.
b) Nee, want \frac{5}{45}=\frac{1}{9} is niet geheel.
c) Ja, want \frac{17}{17}=1 en dat is geheel.
d) Ja, want \frac{3}{1}=3 en dat is geheel.
e) Ja, want \frac{0}{12}=0 en dat is geheel.
f) nee, want \frac{12}{0} kan niet.

Opdracht 2: (Bron: Project Euler probleem 1)
De lijst van alle positieve gehele getallen onder de 10 die veelvouden van 3 of 5 zijn, zijn 3, 5, 6 en 9. Deze getallen hebben een som van 23. Schrijf in Python een programma die de som van alle positieve gehele getallen onder de 1000 vindt die een veelvoud van 3 of 5 zijn.

Uitwerking:

In Python kunnen we met b\%a==0 controleren of a een deler is van b. Het onderstaande programma test dus voor ieder getal onder de 1000 of die een deler is van a of b en als dat het geval is, wordt die bij de uitkomst opgeteld.

som = 0
for n in range(1,1000):
    if n % 3 == 0 or n % 5 == 0:
        som += n
print(som)

Het antwoord is dan 233168.

Cirkels (VWO 6 wis B)

Hier kun je een bestand downloaden met 10 examencontexten over bewegingsvergelijkingen. Tips en uitwerkingen van deze contexten vind je op de volgende pagina’s:

Cryptografie les 5: Encryptiefunctie

Bij de encryptie van een tekst gebruiken we altijd de volgende stappen:

  1. Zet de tekst om in een serie getallen
  2. Voer een encryptiefunctie E(x) uit.
  3. Zet de getallen om in de versleutelde tekst.

Bij de decryptie van een tekst maak je de stappen in omgekeerde volgorde ongedaan:

  1. Zet de versleutelde tekst om in getallen.
  2. Voer de decryptiefunctie D(x) uit (D(x) is de inverse functie van E(x))
  3. Zet de getallen om in een leesbare tekst.

Op deze pagina zullen we dit illustreren aan de hand van een voorbeeld. Hierbij gebruiken we de volgende omzetting van letters naar getallen:

Daarnaast gebruiken we in dit voorbeeld de encryptiefunctie E(x)=3x \text{ mod } 26. Hierbij betekent modulo 26 (kortweg mod 26) dat we de rest nemen na deling door 26 (de %-operator in Python).

Opdracht 1:
a) Laat zien dat E(10)=4.
b) Leg uit waarom uit het antwoord van opdracht a volgt dat de encryptiefunctie E(x)=3x \text{ mod } 26 de letter K op de letter E afbeeldt.
c) Op welke letter wordt de X afgebeeld door deze encryptiefunctie?

Uitwerking 1a:

E(10)=3\cdot 10 \text{ mod } 26 = 30 \text{ mod } 26 = 4

Uitwerking 1b:

Bij het versleutelen van de letter K worden drie stappen gedaan:
1. De letter K wordt omgezet in het getal 10.
2. De encryptiefunctie zet 10 om in het getal E(10)=4.
3. De 4 wordt weer omgezet in de letter E met behulp van de tabel.

Uitwerking 1c:
  1. De letter X wordt eerst omgezet in het getal 23.
  2. Het getal 23 wordt versleuteld naar het getal E(23)=3\cdot 23 \text{ mod } 26 = 69 \text{ mod } 26 = 17
  3. Het getal 17 wordt omgezet in de letter R.

Conclusie: De X wordt afgebeeld op de R.

Bij deze encryptiefunctie hoort de decryptiefunctie D(x)=9x \text{ mod } 26. De reden is dat D(E(x))=9(3x) \text{ mod } 26 = 27x \text{ mod } 26= (26x+x) \text{ mod } 26= x.
De bovenstaande berekening laat zien dat als je de encryptiefunctie en decryptiefunctie na elkaar uitvoert het oorspronkelijke woord er weer uitkomt.

Opdracht 2:
a) Versleutel een woord met de encyryptiefunctie E(x) en geef het versleutelde woord aan de persoon naast je.
b) Ontcijfer het woord dat degene naast je versleuteld heeft.

Bovenstaande is zeker voor lange teksten best veel werk. Daarom gaan we op de volgende pagina dit laten automatiseren met Python. Eerst heb ik hieronder nog een paar andere encryptiefuncties staan. Kijk of het je lukt om bij iedere functie een decryptiefunctie te vinden.

Opdracht 3:
a) Verzin een decryptiefunctie bij E(x)=x+5 \text{ mod } 26.
b) Verzin een decryptiefunctie bij E(x)=(3x+5)\text{ mod } 26.
c) Verzin een decryptiefunctie bij E(x)=5x\text{ mod } 26.

Uitwerking 3a:

D(x)=x-5 \text{ mod } 26 werkt, omdat D(E(x))=((x+5)-5)\text{ mod } 26 = x \text{ mod } 26

Manier om op het antwoord te komen:
Je wilt 5 optellen ongedaan maken. Dat kun je doen door juist 5 af te trekken.

Uitwerking 3b:

D(x)=9(x-5)\text{ mod } 26 werkt, omdat D(E(x))=9((3x+5)-5) \text{ mod } 26 = 27x \text{ mod } 26= (26x+x) \text{ mod } 26= x

Manier om op het antwoord te komen:
Eigenlijk bestaat de encryptiefunctie E(x)=(3x+5)\text{ mod } 26 uit twee stappen. Eerst keer 3 en dan plus 5. Bij het maken van een inverse wil je die in omgekeerde functie ongedaan maken. Dat is eerst 5 aftrekken (om de plus 5 ongedaan te maken) en dan keer 9 doen (om de keer 3 ongedaan te maken).

Uitwerking 3c:

D(x)=21x \text{ mod } 26 werkt, omdat D(E(x))=21(5x)\text{ mod } 26 = 105x \text{ mod } 26 =(104x + x) \text{ mod } 26 = x

Manier om op het antwoord te komen:
De truc is om een getal a te vinden, zodat 5a één meer is dan een 26-voud. Als dat namelijk het geval is, geldt 5a \text{ mod } 26 = 1 en daarom ook 5ax \text{ mod } 26 = 1\cdot x = x. Als we die gevonden hebben, tonen deze berekeningen dat D(x)=ax een inverse is van E(x)=5x.

Om de bovenstaande a te vinden, kun je gewoon veelvouden van 26 noteren, totdat het getal dat erboven zit een vijfvoud is. Dat gebeurt bij 4\cdot 26=104 en dan is de gezochte a dus \frac{105}{5}=21.

Bonusopdracht:
Op de volgende pagina staat een Python-programma die bij een invoer van een woord met alleen hoofdletters als uitvoer het versleutelde woord na uitvoeren van de encryptie met E(x)=3x \text{ mod } 26 geeft. Als uitdaging kun je proberen of het je lukt om zo’n programma te schrijven voordat je op de volgende pagina spiekt.

Hint:

Zoek op internet op wat de ord– en de chr-functie doen.

Cirkels (Havo 5 wis B)

Kennis die je nodig hebt:

  • Je moet het snijpunt van een lijn met een cirkel kunnen bepalen.
  • Je moet de formule van een cirkel kunnen opstellen als je het middelpunt en de straal weet.
  • Afstand tussen twee punten (afstand tussen punt en cirkel)
  • Lijnen k en l staan loodrecht op elkaar als a_l=\frac{-1}{a_k}.
  • Oppervlakte en omtrek cirkel
  • Horizontale en verticale raaklijnen

Hints

  • In een cirkel is het vaak nuttig om stralen in te tekenen. Als twee cirkels raken is ook de verbindingslijn tussen de twee middelpunten vaak nuttig. De lengte van deze lijn is de som van de twee stralen.
  • Bij het berekenen van het y-coördinaat van het snijpunt van een lijn en een cirkel moet je het x-coördinaat invullen in de lijn (de cirkel geeft je namelijk twee antwoorden waarvan er maar één klopt).

Kennisoverzicht vwo wiskunde B

De examentraining op deze website bestaat voor een groot deel uit examensommen. Door namelijk veel van deze sommen te doen, word je steeds beter in het herkennen wat je bij een examensom moet doen.

Het maken van examensommen heeft echter pas zin als je basiskennis en basisvaardigheden in orde zijn. Daarom vind je (binnenkort) op de volgende pagina’s een aantal check’s om te kijken of je deze vaardigheden goed genoeg beheerst.

  • Pagina 2: Kennisoverzicht en kennischeck
  • Pagina 3: Oplossen van vergelijkingen
  • Pagina 4: Differentiëren
  • Pagina 5: Integreren
  • Pagina 6: Limieten, perforaties en asymptoten
  • Pagina 7: Meetkunde
  • Pagina 8: Goniometrie
  • Pagina 9: Formules opstellen
  • Pagina 10: Absolute waarde
  • Pagina 11: Examenwerkwoorden

Let erop dat deze pagina’s bedoeld zijn als check of je alle kennis en vaardigheden al hebt. Als je een vaardigheid nog niet beheerst, adviseer ik dat je met een ander boek of website nog specifiek met die vaardigheid oefent.