Wat is het belangrijkste verschil tussen een sleutel, een IV en een nonce?
Een sleutel, in de context van symmetrische cryptografie, is iets dat je geheim houdt. Iedereen die je sleutel kent (of kan raden) kan alle gegevens ontcijferen die je ermee hebt versleuteld (of alle authenticatiecodes vervalsen die je ermee hebt berekend, enzovoort).
(Er is ook “asymmetrische” of “public key” cryptografie, waarbij de sleutel in feite uit twee delen bestaat: de particuliere sleutel, waarmee kan worden ontsleuteld en/of ondertekend, en een openbare sleutel (afgeleid van de overeenkomstige particuliere sleutel) waarmee kan worden versleuteld en/of ondertekend.)
Een IV of initialisatievector is, in de breedste zin van het woord, gewoon de beginwaarde die wordt gebruikt om een of ander iteratief proces te starten. De term wordt in een aantal verschillende contexten gebruikt en impliceert in elk daarvan verschillende beveiligingseisen. Zo hebben cryptografische hashfuncties gewoonlijk een vaste IV, dat is gewoon een willekeurige constante die in de hashfunctie-specificatie is opgenomen en wordt gebruikt als de aanvankelijke hashwaarde voordat gegevens worden ingevoerd:
Omgekeerd vereisen de meeste blokcijfermethoden een IV die willekeurig en onvoorspelbaar is, of op zijn minst uniek voor elk bericht dat met een gegeven sleutel wordt versleuteld. (Als elke sleutel slechts wordt gebruikt om één bericht te vercijferen, kan men natuurlijk wegkomen met een vaste IV). Deze willekeurige IV zorgt ervoor dat elk bericht anders versleuteld wordt, zodat het zien van meerdere berichten die met dezelfde sleutel versleuteld zijn de aanvaller niet meer informatie geeft dan het zien van een enkel lang bericht. In het bijzonder zorgt het ervoor dat het tweemaal versleutelen van hetzelfde bericht twee totaal verschillende cijferteksten oplevert, hetgeen noodzakelijk is om het encryptieschema semantisch veilig te maken.
In elk geval hoeft het IV nooit geheim te worden gehouden – als dat wel het geval was, zou het een sleutel zijn, en geen IV. Sterker nog, in de meeste gevallen zou het geheimhouden van de IV niet praktisch zijn, zelfs als je dat zou willen, omdat de ontvanger het moet weten om de gegevens te ontcijferen (of de hash te verifiëren, enz.).
Een nonce, in de ruime zin, is gewoon “een getal dat slechts eenmaal wordt gebruikt”. De enige eis die in het algemeen aan een nonce wordt gesteld, is dat hij nooit tweemaal mag worden gebruikt (binnen het relevante toepassingsgebied, zoals encryptie met een bepaalde sleutel).De unieke IV’s die voor block cipher encryptie worden gebruikt, kwalificeren als nonces, maar diverse andere cryptografische schema’s maken ook gebruik van nonces.
Er is enige variatie over welke van de termen “IV” en “nonce” wordt gebruikt voor de verschillende werkwijzen van block cipher: sommige auteurs gebruiken uitsluitend de een of de ander, terwijl anderen een onderscheid tussen beide maken. Voor de CTR modus in het bijzonder reserveren sommige auteurs de term “IV” voor het volledige invoerblok van het cijfer gevormd door de aaneenschakeling van de nonce en de initiële tellerwaarde (gewoonlijk een blok van allemaal nullen bits), terwijl anderen er de voorkeur aan geven de term “IV” helemaal niet te gebruiken voor de CTR modus. Dit alles wordt bemoeilijkt door het feit dat er verschillende variaties zijn op de wijze waarop de nonce/IV die met het bericht in CTR modus wordt meegezonden, feitelijk in de initiële blokcijferinput wordt gemapt.
Omgekeerd wordt voor andere modi dan CTR (of verwante modi zoals EAX of GCM) de term “IV” bijna universeel verkozen boven “nonce”. Dit geldt in het bijzonder voor de CBC-mode, omdat deze eisen stelt aan de IV (met name dat zij onvoorspelbaar zijn) die verder gaan dan de gebruikelijke eis van uniciteit die van nonces wordt verwacht.