Zum Hauptinhalt springen

2.6 Generating the Poly1305 Key Using ChaCha20 (Erzeugung des Poly1305-Schlüssels mit ChaCha20)

2.6 Generating the Poly1305 Key Using ChaCha20 (Erzeugung des Poly1305-Schlüssels mit ChaCha20)

Wie in Abschnitt 2.5 ausgeführt, ist es zulässig, den einmaligen Poly1305-Schlüssel pseudozufällig zu erzeugen. Dieser Abschnitt definiert ein solches Verfahren.

Um ein solches Schlüsselpaar (r,s) zu erzeugen, wird die in Abschnitt 2.3 beschriebene ChaCha20-Blockfunktion verwendet. Dabei wird vorausgesetzt, dass ein 256-Bit-Sitzungsschlüssel speziell für die Message Authentication Code (Nachrichtenauthentifizierungscode-, MAC-)Funktion vorliegt. Jedes Dokument, das die Verwendung von Poly1305 als MAC-Algorithmus für ein Protokoll festlegt, MUSS festlegen, dass 256 Bits für den Integritätsschlüssel reserviert sind. Hinweis: In der in Abschnitt 2.8 definierten AEAD-Konstruktion (Authenticated Encryption with Associated Data, authentifizierte Verschlüsselung mit zugehörigen Daten) wird derselbe Schlüssel für Verschlüsselung und Schlüsselerzeugung verwendet.

Das Verfahren besteht darin, die Blockfunktion mit folgenden Parametern aufzurufen:

  • Der 256-Bit-Sitzungsintegritätsschlüssel wird als ChaCha20-Schlüssel verwendet.

  • Der Blockzähler wird auf null gesetzt.

  • Das Protokoll legt ein 96-Bit- oder 64-Bit-Nonce fest. Dieses MUSS bei jeder Aufrufvariante mit demselben Schlüssel eindeutig sein und DARF daher NICHT zufällig erzeugt werden. Ein Zähler ist eine geeignete Implementierung, andere Verfahren wie ein Linear Feedback Shift Register (linear rückgekoppeltes Schieberegister, LFSR) sind ebenfalls zulässig. ChaCha20, wie hier spezifiziert, erfordert ein 96-Bit-Nonce. Ist das bereitgestellte Nonce nur 64 Bit lang, werden die ersten 32 Bits des Nonce auf eine Konstante gesetzt. Üblicherweise ist das null; bei Protokollen mit mehreren Sendern kann sie pro Sender unterschiedlich sein, SOLLTE aber für alle Aufrufe der Funktion mit demselben Schlüssel durch einen bestimmten Sender gleich bleiben.

Nach Ausführung der Blockfunktion liegt ein 512-Bit-Zustand vor. Die ersten 256 Bits des serialisierten Zustands werden als einmaliger Poly1305-Schlüssel verwendet: die ersten 128 Bits werden begrenzt (« clamped ») und bilden « r », die folgenden 128 Bits werden « s ». Die übrigen 256 Bits werden verworfen.

Hinweis: Viele Protokolle sehen ein Nonce für Verschlüsselungsalgorithmen vor (oft Initialisierungsvektor, Initialization Vector, IV genannt), meist aber nicht für die MAC-Funktion. Dann muss das pro Aufruf verwendete Nonce von woanders kommen, etwa von einem Nachrichtenzähler.

2.6.1 Poly1305 Key Generation in Pseudocode (Poly1305-Schlüsselerzeugung in Pseudocode)

poly1305_key_gen(key,nonce):
counter = 0
block = chacha20_block(key,counter,nonce)
return block[0..31]
end

2.6.2 Poly1305 Key Generation Test Vector (Testvektor zur Poly1305-Schlüsselerzeugung)

In diesem Beispiel setzen wir:

Schlüssel:

000  80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f  ................
016 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f ................

Nonce:

000  00 00 00 00 00 01 02 03 04 05 06 07              ............

ChaCha-Zustand nach Initialisierung mit Schlüssel, Nonce und Blockzähler null:

      61707865  3320646e  79622d32  6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000000 03020100 07060504

ChaCha-Zustand nach 20 Runden:

      8ba0d58a  cc815f90  27405081  7194b24a
37b633a8 a50dfde3 e2b8db08 46a6d1fd
7da03782 9183a233 148ad271 b46773d1
3cc1875a 8607def1 ca5c3086 7085eb87

Ausgabebytes:

000  8a d5 a0 8b 90 5f 81 cc 81 50 40 27 4a b2 94 71  ....._...P@'J..q
016 a8 33 b6 37 e3 fd 0d a5 08 db b8 e2 fd d1 a6 46 .3.7...........F

Diese Ausgabe ist zugleich der 32-Byte-Einmalschlüssel für Poly1305.