Uitleg van de werking van ElGamal encryptie, althans voor zover ik de werking begrijp (ik vind de materie interessant maar ben geen cryptograaf). Ik hoop dat ik geen domme dingen schrijf, correcties en aanvullingen zijn van harte welkom! Lezers worden verzocht te checken of ik hieronder latere bijdragen met aanvullingen/correcties heb toegevoegd (want ca. 1 uur na het posten van een bijdrage kan ik er niets meer in wijzigen).
Vooraf, voor TS en andere lezers: het doel van asymetrische encryptie is dat jij, indien jij een public key van Bob hebt (en zeker weet dat deze van
de jou bekende Bob is), en alleen Bob de bijpassende private key heeft, jij een bericht voor Bob met Bob's public key kunt versleutelen, waarna niemand anders dan Bob dat versleutelde bericht kan ontsleutelen (nl. met Bob's private key).
Tenzij die versleuteling kwetsbaarheden kent natuurlijk, waaronder die in specifieke situaties kunnen optreden xoals beschreven door Luca De Feo, Bertram Poettering, Alessandro Sorniotti in [1] en [2] (zie mijn vorige bijdrage).
ElGamal encryptieZoals gezegd, ik ben geen cryptograaf, maar de uitleg van ElGamal encryptie in [3] kon ik goed volgen - waarbij de rekenvoorbeelden met kleine getallen (in de praktijk onbruikbaar, want simpel te kraken) in de cyaankleurige vlakken kunnen helpen begrijpen hoe e.e.a. in z'n werk gaat.
[3]
https://www.di-mgt.com.au/public-key-crypto-discrete-logs-3-elgamal.html (de eerste beschrijving die ik, na zoeken op internet, goed kon volgen)
Domain parametersWat je moet weten is dat ElGamal encryptie van dezelfde "domain parameters" gebruik maakt als het Diffie-Hellman key agreement protocol (laatstgenoemd protocol wordt tegenwoordig bij het opzetten van nagenoeg elke https verbinding gebruikt). Die "domain parameters" bestaan uit drie getallen: twee priemgetallen
p en
q alsmede een ander getal
g. In [4] kun je lezen hoe die getallen worden gegenereerd, en na genereren op geldigheid kunnen worden gecheckt (alles eveneens voorzien van voorbeelden met onrealistisch kleine getallen).
[4]
https://www.di-mgt.com.au/public-key-crypto-discrete-logs-1-diffie-hellman.htmlBerekenen ElGamal sleutelpaar voor BobVereenvoudigd: gegeven
p,
q en
g kan Bob's software een sleutelpaar genereren door een random getal
b te kiezen, de private key. De "bijpassende" public key
B wordt dan berekend (door Bob's software) als volgt:
B = g^b mod p
Hierbij staat "mod" voor de modulus functie, oftewel de rest na deling met gehele getallen (7 mod 4 = 3, want 7 / 4 = 1, rest 3). Je ziet
q niet terug in deze formule; deze is echter wel nodig, omdat de gekozen random private key
b kleiner moet zijn dan
q - 2 (zie [5]).
[5]
https://www.di-mgt.com.au/public-key-crypto-discrete-logs-1-diffie-hellman.html#note2q2De in [4] gebruikte kleine getallen
p=283,
q=47,
g=60, alsmede (uit [3]) Bob's private key
b=7, maken hoofdrekenen (voor de meesten 8-) lastig, want je komt bijv. 60^7 tegen. Daarom gebruik ik als voorbeeld hier
nog kleinere getallen (hartstikke kraakbaar in de praktijk). Uitgaande van
p=11,
q=5,
g=9 en Bob's private key
b=2 wordt de formule:
B = 9^2 mod 11 = 81 mod 11 = 4 (want 7 x 11 = 77, de rest na deling is dus 4).
Bob verspreidt zijn public keyAls Bob wil dat Alice een bericht bestemd voor Bob versleutelt voor verzending, moet hij zijn public key
B samen met de drie domain parameters
p,
q en
g naar Alice sturen. Gemakshalve noemen we die
feitelijke public key
B plus de domain parameters de public key van Bob, die hij ook op een publieke keyserver kan zetten.
Van het grootste belang is dat niemand uit die gegevens de feitelijke
private key
b van Bob kan uitrekenen. Daarom is het onder meer noodzakelijk dat
p een zeer groot priemgetal is, bij voorkeur een
safe prime. Een safe prime
p is een priemgetal waarvoor geldt dat
q ook een priemgetal is in
p = 2 * q + 1. In de begintijd van PGP waren computers niet krachtig genoeg om (voor grote
p) vast te stellen of
p een
safe prime was. Daardoor kan een voldoende grote sleutel (bijv. 2048 bits) toch zwak zijn. Ook moeten
q en
b niet te klein zijn en ook aan
g worden eisen gesteld.
Alice versleutelt bericht voor BobAls Alice een bericht
m versleuteld naar Bob wil sturen, genereert haar software een ephemeral random getal
k kleiner dan
q - 2. Vervolgens berekent haar software:
c1 = g^k mod p
en
c2 = m * B^k mod p
Stel dat het te versleutelen bericht
m gelijk is aan 6 en de software van Alice voor
k de waarde 3 gekozen heeft:
c1 = 9^3 mod 11 = 729 mod 11 = 3 (want 66 * 11 is 726, de rest is dus 3)
en
c2 = 6 * 4^3 mod 11 = 384 mod 11 = 10 (want 34 * 11 is 374, de rest is dus 10)
Alice stuurt versleutelde bericht naar BobHet versleutelde bericht bestaat uit de twee componenten
c1 en
c2. Vertaald uit [3], cryptograaf Neal Koblitz zou dit paar beschreven hebben als volgt:
c2 is het bericht
m "met een masker" en
c1 is een "hint" die kan worden gebruikt om het masker te verwijderen, maar alleen door iemand die de private key
b kent.
Decryptie door BobBob ontvangt
c1 en
c2 en berekent:
m = c1^(p - b -1) * c2 mod p
Met de kleine voorbeeldgetallen:
m = 3^(11 - 2 -1) * 10 mod 11 = 3^8 * 10 mod 11 = 65610 mod 11 = 6 (want 5964 * 11 = 65604)
Asymmetrische encryptie van grote berichtenIk heb hierboven enkele details weggelaten: o.a. de rol van
g, maar ook dat
m niet groter mag zijn dan
p - 1 (bij een bitlengte van p van 2048 hits kan dit flink minder zijn dan 256 bytes). Omdat je meestal grotere bestanden wilt versleutelen, wordt
tevens gebruik gemaakt van symmetrische encryptie, vaak AES. Er wordt dan door Alice een random symmetrische sleutel
m gegenereerd waarmee het hele bericht wordt versleuteld, waarna die
symmetrische sleutel m als "bericht" wordt gebruikt in de hierboven beschreven ElGamal versleuteling. Alice stuurt dan, naast
c1 en
c2, ook het symmetrisch versleutelde bericht naar Bob. Zodra Bob
m (nu de symmetrische sleutel) heeft berekend uit
c1 en
c2, kan hij het meegezonden symmetrisch versleutelde bestand ontsleutelen met
m.