Sleutels en encryptie

By 7 maart 2019 juli 24th, 2019 Blog
Deel dit bericht!

In de vorige blogs uit
deze reeks zijn de hash en de checksum behandeld. In deze blog gaan we verder
met de volgende onderliggende technologie voor de Blockchain; encryptie.
Encryptie is het versleutelen van data met als doel dat derde partijen niet mee
kunnen kijken.

De hash is een goede
methode om te bepalen of de data die je zojuist ontvangen hebt integer is, of
dat je net het juiste authenticatie token (wachtwoord, pincode, etc) hebt
ontvangen.

In veel gevallen wil
je echter dat vreemden niet in je data kunnen kijken, maar dat je dat zelf wel
kan. We komen dan uit bij het wiskundige neefje van hashing, namelijk
versleuteling, ook wel encryptie genoemd.

Encryptie is een
omkeerbare bewerking op de data, met als gevolg dat de data na deze bewerking
niet leesbaar is. Bij een goed encryptie algoritme is encryptie makkelijk en
snel en is de versleutelde data heel moeilijk terug te herleiden.

Daarnaast is het een
goed idee, als deze bewerking berust op een algemene standaard. Dat is met name
handig als de informatie gecommuniceerd moet worden. De ontvangende partij moet
namelijk op de hoogte zijn van hoe de encryptie werkt en dit ook verwerkt
hebben in zijn software.

We willen dus niet
dit:

 

Maar dit:

 

Met de ontvangende partij is een afspraak gemaakt over hoe de encryptie machines te gebruiken. Deze afspraak wordt ook wel de sleutel genoemd.

SYMMETRISCHE ENCRYPTIE

Een rekenvoorbeeld:
We gaan data versleutelen met het volgende (standaard) algoritme:
versleuteld = onversleuteld * sleutel(1) + sleutel(2)

En het tegenovergestelde:
onversleuteld = ( versleuteld – sleutel(2) ) / sleutel(1)

Met de ontvangende
partij maken we de afspraak dat sleutel(1) gelijk is aan 5
en sleutel(2) gelijk is aan 2

In het hoofdstuk over
hashing hadden we het woord Nederland al omgezet in een reeks getallen.

n=14 → 14 * 5 + 2 = 72

Het getal 72 is dus de versleutelde waarde van “n”. Op deze manier kunnen we het hele woord doen:

 

En de ontvanger kan
dit woord weer terugvertalen door:

( 72 – 2 ) / 5 = 14 → 14 = n

Overigens is dit
encryptie algoritme bijzonder slecht. Een wiskundige zal er niet heel lang over
doen om de sleutels te achterhalen (het algoritme was immers niet geheim). De
tijd die hij ervoor nodig heeft kan enigszins verlengd worden door hele grote
getallen te nemen voor de sleutels.

In een opzet waarin
zender en ontvanger dezelfde sleutel gebruiken noemen we de encryptie symmetrisch.
Deze manier van werken heeft een nadeel, ook voor algoritmes van kwaliteit. Ik
moet een afspraak maken met de ontvangende partij over de sleutels. Die kunnen
niet op dezelfde manier verstuurd worden als de rest van de data, aangezien de
sleutel dan misschien onderschept wordt.

De veiligste manier
zou zijn om eerst naar de ontvanger te gaan en hem de sleutels in te
fluisteren. Dat is nogal wat werk de eerste keer. En dat moet iedere keer
opnieuw als er van sleutel gewisseld wordt.

ASYMMETRISCHE ENCRYPTIE

Stel dat we een
algoritme zouden kunnen vinden waarvoor je een sleutel hebt voor het
versleutelen van de data en een andere sleutel moet gebruiken voor het
ontsleutelen. Dan zou je de ene sleutel kunnen opsturen naar de partij die jou
geheime informatie moet sturen. De sleutel die gebruikt wordt voor het
versleutelen van de gegevens kan niet gebruikt worden voor het ontsleutelen.
Die hoeft dus niet geheim te blijven, die kan bijvoorbeeld gewoon per mail
opgestuurd worden. Daarom noemen we die ook wel de “Public Key”. De sleutel die
je houdt is de “Private Key”.

 

In een opzet waarin
zender en ontvanger verschillende sleutels gebruiken noemen we de encryptie asymmetrisch.

 

Een voorbeeld hiervan
en een van de oudste algoritmes op dit vlak, is het RSA (Rivest–Shamir–Adleman)
algoritme.

Het nu volgende stuk
leunt zwaar op een artikel van Burt Kaliski.

Bij RSA bestaan de
Public en de Private Key ieder uit een set van twee getallen.

Voorbeeld; in alle
berekeningen werken we alleen met gehele getallen (niets achter de komma):

 

  1. We beginnen met twee
    grote priemgetallen p en q. Voor ons voorbeeld
    nemen we twee kleine getallen. p=5 en q=11
  2. Via deze getallen
    bepalen we de getallen w, v en x (zie
    artikel). In ons geval

    1. x = 55
    1. w= 7
    1. v=3.
  3. Mijn public key is
    nu (x,v) = (55,3) en mijn private key is nu (x,w) =
    (55,7)

Nu ga ik “nederland” versleutelen met mijn public key en het RSA-algoritme:
versleuteld = onversleuteldv mod x

Voor de letter n die vertegenwoordigd werd door de waarde 14:
143 mod 55 = 2744 mod 55 = 49

49 is dus de versleutelde waarde van de letter n in ons voorbeeld. Om hem te ontsleutelen:
onversleuteld = versleuteldw mod x

497 mod 55 = 678223072849 mod 55 = 14

Als ik nu veilig heen
en weer wil communiceren met een andere partij, dan bepalen we beiden onze
eigen private key en berekenen daaruit onze public keys die we vervolgens
uitwisselen.

Dan krijgen we dus dit:

 

SIGNEREN EN VERIFIEREN

Het leuke van dit
algoritme is dat het ook omgekeerd gebruikt kan gebruiken. Als ik 14 versleutel
met mijn private key kan ik hem weer ontsleutelen met mijn public key.

Probeer maar:

147 mod 55 = 9 en 93 mod 55 = 14

Zo op het eerste
gezicht heeft het versleutelen met de private key geen nut, aangezien iedereen
het kan ontsleutelen met de public key die openbaar is.

Maar bedenk dat de
combinatie private/public key uniek is en dat de public key berekend wordt uit
de private key. Het feit dat het bericht ontsleuteld kan worden bewijst dat het
door de houder van de private key gestuurd is (aangenomen dat de private key
niet gestolen is).

Het versleutelen van
data met de private key wordt dan ook anders genoemd. Je versleutelt iets met
de public key en de ondertekent iets met je private key. Maar in feite zijn het
dus dezelfde algoritmes, alleen anders toegepast.

Overigens zijn niet
alle encryptie algoritmes die in gebruik zijn geschikt voor het ondertekenen.
RSA is dat wel, maar Diffie-Hellman bijvoorbeeld niet.

Als we afspreken
elkaar fysiek te ontmoeten voor het uitwisselen van de sleutels, dan kunnen we
daarna niet alleen veilig communiceren, we weten ook nog eens zeker dat we met
elkaar praten.

Gezien het aantal
partijen waarmee we veilig willen communiceren en waarvan we zeker willen zijn
dat we met de juiste persoon praten is het niet handig als we bij al die
partijen eerst op bezoek moeten.

Daarom zijn er
bedrijven die zichzelf aanbieden als vertrouwde derde partij (Trusted Third
Party; TTP). Zij verifiëren op aanvraag van b.v. jouw bank dat een publieke
sleutel ook daadwerkelijk van die bank is. Na verificatie ondertekenen zij de
publieke sleutel inclusief wat informatie over de partij met hun private key.
Het resultaat noemen we een certificaat. Certificaten worden onder andere gebruikt
voor https-websites.

Jij kunt altijd de
ondertekening van het certificaat bevestigen en de geldigheid van het
certificaat toetsen bij de TTP. Je haalt hiervoor eerst het ondertekende
certificaat op bij de bank. De ondertekening ervan ontsleutel je met de
publieke sleutel van de vertrouwde derde partij (zit standaard in je
Internetbrowser). Hiermee wordt aangetoond dat het certificaat ook echt
ondertekend is door de derde partij en dat deze derde partij heeft geverifieerd
dat de publieke sleutel ook daadwerkelijk van de bank is. Nu beschik je over de
publieke sleutel en wat gegevens van de bank en kun je je transacties
versleutelen met de publieke sleutel van de bank en opsturen (en alleen de bank
kan het weer ontsleutelen met hun private key).

“STAY TUNED”VOOR HET VOLGENDE DEEL VAN DEZE BLOGREEKS: “HET BREKEN VAN DE CODE”

BEHANDELDE BEGRIPPEN:

 

  • Asymmetrische Encryptie: Versleuteling waarbij de versleuteling met een key plaatsvindt en ontsleuteling met een andere key, die wel gerelateerd is aan de key die voor versleuteling gebruikt is. Voorbeelden zijn RSA en DSA.
  • Certificaat: Public key in combinatie met gegevens die de identiteit van de houder van de public key aangeven plus een door de TTP ondertekende hash van sleutel en identiteitsgegevens.
  • Encryptie: Het omzetten van een blok data in iets dat zonder kennis te hebben van de sleutel of het algoritme niet is terug te herleiden.
  • Key: Getal of blok data dat in combinatie met het encryptie algoritme gebruikt kan worden om iets te versleutelen.
  • Machtsverheffen: B.v. 43 is gelijk aan 4x4x4.
  • Modulo: Delen met rest. De Modulo is de rest uit de deling.
  • Private Key: Encryptiesleutel die gebruikt wordt in asymmetrische encryptie en geheimgehouden moet worden dor de eigenaar.
  • Public Key: Encryptiesleutel die gebruikt wordt in asymmetrische encryptie en openbaar is.
  • Signing: Versleutelen met de private key.
  • Sleutel: Zie key
  • Symmetrische Encryptie: Versleuteling waarbij beide partijen gebruik maken van dezelfde geheime sleutel. Voorbeelden zijn: Triple-DES (3DES; is niet meer veilig), Blowfish, Two-fish en AES.
  • Trusted Third Party (TTP): Partij die je vertrouwt om de identiteit van andere partijen te controleren.
  • Verifying: Ontsleutelen met de public key.

Vragen over dit artikel?
Neem dan contact op met onze specialist Roel Gloudemans.

 

  • Artikelen