Henk en Ingrid aan de RSA

Henk en Ingrid hebben een mening. Een politiek geladen mening die niet door iedereen gewaardeerd wordt, daarom houden ze hem liever voor zichzelf. Om met elkaar te kunnen praten gebruiken ze encryptie, Henk moet zijn boodschap ongezien bij Ingrid kunnen krijgen, terwijl Ingrid wel in staat moet zijn Henk zijn boodschap te lezen. En vice versa natuurlijk, ook Ingrid heeft een foute mening.

Dit doe je met Public Key Cryptografie. Bij Public Key Cryptografie heb je een publieke sleutel die iedereen kan zien en een privé sleutel die alleen van jou is. De publieke sleutel geef je aan iedereen die jou een bericht wil sturen, je kan hem zelfs op het internet zetten. De privé sleutel deel je niet, deze gebruik je om een versleuteld bericht leesbaar te maken.

Gelukkig kan Henk een beetje programmeren! En een beetje is precies genoeg, want zoals Henk zegt:

Wat weten ‘experts’ er nou van?

Dus daar gaan we. Met een kleine disclaimer trouwens: Dit is een oefening in RSA encryptie in Golang. Het is niet gemaakt om in productie gebruikt te worden. En in het echt heet ik geen Henk.

Kijk mee in de code: Clone de repository met het Golang RSA voorbeeld met:
git clone git@github.com:Grrrben/golang-rsa.git

We beginnen met een RSA identiteit. Een simpele Go struct met  een publieke- en privé sleutel, die struct maakt duidelijk waar we over praten en we kunnen er verschillende methods aan hangen.:

Iedereen mag Public benaderen (let ook op de hoofdletter van Public, die de variabele in Go ook echt publiek maakt), private is alleen voor jou. Bij Public Key Cryptografie is het zo dat als Henk Ingrid een bericht wil sturen, hij de publieke sleutel van Ingrid gebruikt om het bericht te versleutelen:

Henk wil aan Ingrid een boodschap wil sturen:

Negenennegentig procent van de problemen in de wereld worden veroorzaakt door buitenlanders.

Henk gebruikt daarvoor de publieke sleutel van Ingrid, met de bovenstaande Encrypt functie wordt het onleesbaar.

Onleesbaar dus, de zin wordt iets als:

zmNOOe@{��}9������#-��^� ����Jh��l0����c2S���a>�AA/�z�2��*c�@^w�P�Xu�HK���hu_u̴Jsi���7 [etc]

Sterker nog, iedere keer als je de zin versleuteld zal de uitkomst anders zijn. De test `TestEncryptionNeverTheSame` in de  testfile laat dit zien.

Niemand kan het lezen, behalve als je Ingrid bent, want dan ben je in het bezit van de privésleutel die deze tekst kan ontsleutelen.

In de repository van Github zitten een paar tests. Die draai je met go test -v. De method TestEncryptDecrypt geeft een voorbeeld van een ontsleuteling van de boodschap met Decrypt.

Wil je wat meer informatie zien dan kun je in de testfile altijd even wat variabelen dumpen met fmt.Println(var). Om de verschillende Messages te dumpen kun je ze het beste even naar een string casten, door string(var) te gebruiken, of nog beter, de Go idioom fmt.Printf("%s", var).

Samenvattend; als iemand, wie dan ook, een bestand of tekst versleuteld met jouw publieke sleutel, ben jij de enige die het kan lezen, door het te ontcijferen met je privésleutel.

Het versleutelen van een boodschap is de voornaamste functionaliteit van encryptie zoals RSA. Je kan er echter nog meer mee, zoals de afzender bewijzen. Daarvoor hoeft je eigen tekst niet eens encrypted te zijn. Dit doe je met de methoden Sign en Verify, waarbij je een boodschap “ondertekend” met je privésleutel waarna iedereen kan verifieren dat het echt jouw boodschap is door de Verify method.

Het ondertekenen van Henk’s publieke boodschap msg, “wetenschap is ook maar een mening”, gebeurd met de private key van de boodschapper. De []byte return value is de signature die met de boodschap meegezonden moet worden.

Hierna kan iedereen verifieren dat de boodschap inderdaad van Henk is, door de Verify method met Henk’s publieke sleutel aan te roepen:

Zodra er iets veranderd aan de boodschap msg, de signature sig of de publieke sleutel pk zal Verify een error terug geven. Dit kunnen we allemaal afvangen met een unittest:

Nog ééntje van Ingrid, om het af te sluiten:

Misschien klopt het niet allemaal, maar het is wel waar.

Zie je iets aan de code dat je zelf anders zou doen? Schiet een PR in bij de repository.

https://xkcd.com/1553/

Bronnen:

Golang RSA package; https://golang.org/pkg/crypto/rsa/

Github repository; https://github.com/Grrrben/golang-rsa

De quotes van Henk en Ingrid zijn geleend; https://bronsdom.wordpress.com/2011/11/17/uitspraken-van-henk-en-ingrid/

Explaining public-key cryptography to non-geeks; https://blog.vrypan.net/2013/08/28/public-key-cryptography-for-non-geeks/

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *