RC4 (encryptie)
RC4 is een cryptografisch stroomvercijferingsalgoritme op basis van symmetrische cryptografie. Het wordt veelvuldig gebruikt in toepassingen, waaronder het Secure Sockets Layer protocol en het WEP protocol voor draadloze beveiliging. Het algoritme zelf is buitengewoon eenvoudig en kan efficiënt geimplementeerd worden op vrijwel alle computers.
Inhoud |
[bewerk] Geschiedenis
RC4 is ontworpen door Ronald Rivest van RSA Security in 1987. De afkorting staat voor "Rivest Cipher 4", maar wordt ook vaak gelezen als "Ron's Code". Rivest ontwikkelde ook de blokvercijferingsalgoritmes RC2, RC5 en RC6, waarvan de laatste twee in samenwerking met anderen.
De werking van RC4 werd aanvankelijk geheim gehouden, maar in 1994 lekte dit geheim uit. Naar de uitgelekte versie van het algoritme wordt soms verwezen onder de naam ARCFOUR (voor alleged-RC4), enerzijds omdat RSA Security nooit heeft bevestigd dat het een correcte beschrijving van het algoritme betreft, anderzijds om juridische problemen te voorkomen.
In 2001 ontdekten Fluhrer, Mantin en Shamir een zwak punt in de wijze waarop RC4 gebruik maakt van sleutels. Indien een reeks berichten is vercijferd met sleutels die onderling weinig verschillen, kan de gehele sleutel achterhaald worden door analyse van een groot aantal berichten. Met deze benadering kan de WEP encryptie voor draadloze verbindingen in de praktijk eenvoudig gekraakt worden.
[bewerk] Werking
De kern van RC4 wordt gevormd door een cryptografische toevalsgenerator die een eindeloze rij bytes produceert. Deze bytes worden door middel van een XOR bewerking gecombineerd met de bytes van de klare tekst, resulterend in de cijfertekst. Ontcijferen bestaat uit precies dezelfde handelingen als vercijferen.
De toevalsgenerator van RC4 heeft een interne toestand van 256 bytes, hieronder aangeduid als de array S[0..255]
, plus nog twee bytes i
en j
die functioneren als indexen in deze array. De array S
bevat een permutatie van de getallen 0 t/m 255; het algoritme wijzigt deze permutatie voortdurend door elementen paarsgewijs te verwisselen.
[bewerk] Sleutelgebruik
RC4 werkt met sleutels van tenminste 1 en ten hoogste 256 bytes. De sleutel wordt gebruikt om de generator in een begintoestand te brengen volgens onderstaande pseudocode.
for i from 0 to 255 S[i] := i j := 0 for i from 0 to 255 j := (j + S[i] + sleutel[i mod sleutellengte]) mod 256 swap(S[i],S[j]) i := 0 j := 0
[bewerk] Genereren van bytes
Na het verwerken van de sleutel, kan de generator gebruikt worden voor het produceren van bytes. Onderstaande pseudocode produceert één byte. Door de code meerdere malen aan te roepen, kunnen zoveel bytes geproduceerd worden als nodig is.
i := (i + 1) mod 256 j := (j + S[i]) mod 256 swap(S[i],S[j]) output(S[(S[i] + S[j]) mod 256])
[bewerk] Veiligheid
Indien correct gebruikt, biedt RC4 een sterke vercijfering die, voor zover bekend, in de praktijk niet gekraakt kan worden. In de loop van de tijd zijn echter een aantal problemen ontdekt waarmee bij het gebruik van RC4 rekening moet worden gehouden. Veel cryptografen raden het gebruik van RC4 daarom af voor nieuwe applicaties.
Het is niet mogelijk om verschillende berichten te vercijferen met dezelfde sleutel. In dat geval zou de XOR-relatie tussen de klare teksten hetzelfde zijn als de XOR-relatie tussen de cijferteksten, wat het zeer eenvoudig maakt om de cijferteksten te kraken. Dit kan opgelost worden door aan elk bericht een uniek serienummer toe te wijzen, en de sleutel voor dat bericht te berekenen met een cryptografische hashfunctie over de basissleutel en het serienummer.
De verwerking van sleutels is een zwak punt in RC4. Dit is verschillende malen aangetoond, het duidelijkst door de aanval van Fluhrer, Mantin en Shamir. In het bijzonder is het onveilig om de berichtsleutel te vormen door een serienummer achter een basissleutel te plakken (zoals gedaan wordt in het WEP protocol). Sleutels moeten daarom eigenlijk altijd voorbewerkt worden met een cryptografische hashfunctie zodat er in de RC4-sleutel geen systematische patronen kunnen zitten.
De toevalsgenerator van RC4 lekt informatie over de sleutel in de eerste bytes die geproduceerd worden. Om deze reden wordt geadviseerd om de eerste 256 tot zelfs 1536 [1] geproduceerde bytes weg te gooien, en pas daarna te beginnen met vercijferen.