2.8 AEAD Construction (AEAD-Konstruktion)
2.8 AEAD Construction (AEAD-Konstruktion)
AEAD_CHACHA20_POLY1305 ist ein Algorithmus für authentifizierte Verschlüsselung mit zusätzlichen Daten (Authenticated Encryption with Associated Data, AEAD). Die Eingaben für AEAD_CHACHA20_POLY1305 sind:
-
Ein 256-Bit-Schlüssel
-
Ein 96-Bit-Nonce, der bei jeder Aufruf mit demselben Schlüssel ein anderer sein muss
-
Ein Klartext (plaintext) beliebiger Länge
-
Zusätzliche authentifizierte Daten (Additional Authenticated Data, AAD) beliebiger Länge
Einige Protokolle können pro Aufruf eindeutige Eingaben haben, die nicht 96 Bit lang sind. IPsec kann beispielsweise einen 64-Bit-Nonce vorgeben. In einem solchen Fall obliegt es dem Protokolldokument festzulegen, wie der Protokoll-Nonce in einen 96-Bit-Nonce umgewandelt wird, etwa durch Anhängen eines konstanten Werts.
Die Primitiven ChaCha20 und Poly1305 werden zu einem AEAD kombiniert, der einen 256-Bit-Schlüssel und einen 96-Bit-Nonce wie folgt verwendet:
-
Zuerst wird ein Poly1305-Einmalschlüssel aus dem 256-Bit-Schlüssel und dem Nonce nach dem in Abschnitt 2.6 beschriebenen Verfahren erzeugt.
-
Als Nächstes wird die ChaCha20-Verschlüsselungsfunktion aufgerufen, um den Klartext zu verschlüsseln, mit demselben Schlüssel und Nonce und mit dem Anfangszähler auf 1.
-
Schließlich wird die Poly1305-Funktion mit dem oben berechneten Poly1305-Schlüssel und einer Nachricht aufgerufen, die als Verkettung der folgenden Teile konstruiert ist:
-
Die AAD
-
padding1 -- die Auffüllung besteht aus höchstens 15 Nullbytes und bringt die bisherige Gesamtlänge auf ein ganzzahliges Vielfaches von 16. War die Länge der AAD bereits ein ganzzahliges Vielfaches von 16 Bytes, ist dieses Feld leer.
-
Der Geheimtext (ciphertext)
-
padding2 -- die Auffüllung besteht aus höchstens 15 Nullbytes und bringt die bisherige Gesamtlänge auf ein ganzzahliges Vielfaches von 16. War die Länge des Geheimtexts bereits ein ganzzahliges Vielfaches von 16 Bytes, ist dieses Feld leer.
-
Die Länge der zusätzlichen Daten in Oktetten (als 64-Bit-Little-Endian-Ganzzahl).
-
Die Länge des Geheimtexts in Oktetten (als 64-Bit-Little-Endian-Ganzzahl).
-
Die Ausgabe des AEAD ist die Verkettung von:
-
Einem Geheimtext derselben Länge wie der Klartext.
-
Einem 128-Bit-Tag, der die Ausgabe der Poly1305-Funktion ist.
Die Entschlüsselung verläuft ähnlich, mit folgenden Unterschieden:
-
Die Rollen von Geheimtext und Klartext sind vertauscht, sodass die ChaCha20-Verschlüsselungsfunktion auf den Geheimtext angewendet wird und den Klartext erzeugt.
-
Die Poly1305-Funktion wird weiterhin auf die AAD und den Geheimtext ausgeführt, nicht auf den Klartext.
-
Das berechnete Tag wird bitweise mit dem empfangenen Tag verglichen. Die Nachricht ist genau dann authentifiziert, wenn die Tags übereinstimmen.
Einige Anmerkungen zu diesem Entwurf:
-
Die in einem einzelnen Aufruf verschlüsselbare Datenmenge beträgt höchstens
2^32-1Blöcke zu je 64 Bytes, wegen der Größe des Blockzählerfelds in der ChaCha20-Blockfunktion. Das ergibt insgesamt 274.877.906.880 Bytes, also fast 256 GB. Das sollte für Verkehrsprotokolle wie IPsec und TLS ausreichen, kann aber für Datei- und/oder Festplattenverschlüsselung zu klein sein. Für solche Anwendungen kann man zum ursprünglichen Entwurf zurückkehren, den Nonce auf 64 Bit verkürzen und die Ganzzahl an Position 13 als oberste 32 Bits eines 64-Bit-Blockzählers verwenden, wodurch die Gesamtnachrichtengröße auf über eine Million Petabyte anwächst (genau 1.180.591.620.717.411.303.360 Bytes). -
Trotz des vorherigen Punkts begrenzt das Geheimtextlängenfeld im Aufbau des Puffers, auf dem Poly1305 arbeitet, die Größe des Geheimtexts (und damit des Klartexts) auf
2^64Bytes, also sechzehntausend Petabyte (genau 18.446.744.073.709.551.616 Bytes).
Die AEAD-Konstruktion in diesem Abschnitt ist eine neuartige Zusammensetzung aus ChaCha20 und Poly1305. Eine Sicherheitsanalyse dieser Zusammensetzung findet sich in [Procter].
Hier ist eine Liste der Parameter für diese Konstruktion, wie sie in Abschnitt 4 von [RFC5116] definiert sind:
-
K_LEN (Schlüssellänge) beträgt 32 Oktetts.
-
P_MAX (maximale Klartextgröße) beträgt 274.877.906.880 Bytes, also fast 256 GB.
-
A_MAX (maximale Größe der zugehörigen Daten) wird durch das Längenfeld für zugehörige Daten auf
2^64-1Oktetts gesetzt. -
N_MIN = N_MAX = 12 Oktetts.
-
C_MAX = P_MAX + Taglänge = 274.877.906.896 Oktetts.
Unterschiedliche AAD-Eingaben (wie in Abschnitt 3.3 von [RFC5116] beschrieben) MÜSSEN zu einer einzigen Eingabe für AEAD_CHACHA20_POLY1305 verkettet werden. Es obliegt der Anwendung, bei Bedarf eine Struktur in der AAD-Eingabe zu erzeugen.
2.8.1 Pseudocode for the AEAD Construction (Pseudocode für die AEAD-Konstruktion)
pad16(x):
if (len(x) % 16)==0
then return NULL
else return copies(0, 16-(len(x)%16))
end
chacha20_aead_encrypt(aad, key, iv, constant, plaintext):
nonce = constant | iv
otk = poly1305_key_gen(key, nonce)
ciphertext = chacha20_encrypt(key, 1, nonce, plaintext)
mac_data = aad | pad16(aad)
mac_data |= ciphertext | pad16(ciphertext)
mac_data |= num_to_8_le_bytes(aad.length)
mac_data |= num_to_8_le_bytes(ciphertext.length)
tag = poly1305_mac(mac_data, otk)
return (ciphertext, tag)
2.8.2 Example and Test Vector for AEAD_CHACHA20_POLY1305 (Beispiel und Testvektor)
Als Testvektor verwenden wir die folgenden Eingaben für die Funktion AEAD_CHACHA20_POLY1305:
Plaintext:
000 4c 61 64 69 65 73 20 61 6e 64 20 47 65 6e 74 6c Ladies and Gentl
016 65 6d 65 6e 20 6f 66 20 74 68 65 20 63 6c 61 73 emen of the clas
032 73 20 6f 66 20 27 39 39 3a 20 49 66 20 49 20 63 s of '99: If I c
048 6f 75 6c 64 20 6f 66 66 65 72 20 79 6f 75 20 6f ould offer you o
064 6e 6c 79 20 6f 6e 65 20 74 69 70 20 66 6f 72 20 nly one tip for
080 74 68 65 20 66 75 74 75 72 65 2c 20 73 75 6e 73 the future, suns
096 63 72 65 65 6e 20 77 6f 75 6c 64 20 62 65 20 69 creen would be i
112 74 2e t.
AAD:
000 50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7 PQRS........
Key:
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 ................
IV:
000 40 41 42 43 44 45 46 47 @ABCDEFG
32-bit fixed-common part:
000 07 00 00 00 ....
Setup zur Erzeugung des Poly1305-Einmalschlüssels (Absender id=7):
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000007 43424140 47464544
Nach Erzeugung des Poly1305-Einmalschlüssels:
252bac7b af47b42d 557ab609 8455e9a4
73d6e10a ebd97510 7875932a ff53d53e
decc7ea2 b44ddbad e49c17d1 d8430bc9
8c94b7bc 8b7d4b4b 3927f67d 1669a432
Poly1305 Key:
000 7b ac 2b 25 2d b4 47 af 09 b6 7a 55 a4 e9 55 84 {.+%-.G...zU..U.
016 0a e1 d6 73 10 75 d9 eb 2a 93 75 78 3e d5 53 ff ...s.u..*.ux>.S.
Poly1305 r = 455e9a4057ab6080f47b42c052bac7b
Poly1305 s = ff53d53e7875932aebd9751073d6e10a
keystream bytes:
9f:7b:e9:5d:01:fd:40:ba:15:e2:8f:fb:36:81:0a:ae:
c1:c0:88:3f:09:01:6e:de:dd:8a:d0:87:55:82:03:a5:
4e:9e:cb:38:ac:8e:5e:2b:b8:da:b2:0f:fa:db:52:e8:
75:04:b2:6e:be:69:6d:4f:60:a4:85:cf:11:b8:1b:59:
fc:b1:c4:5f:42:19:ee:ac:ec:6a:de:c3:4e:66:69:78:
8e:db:41:c4:9c:a3:01:e1:27:e0:ac:ab:3b:44:b9:cf:
5c:86:bb:95:e0:6b:0d:f2:90:1a:b6:45:e4:ab:e6:22:
15:38
Ciphertext:
000 d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 ...4d.`.{...S.~.
016 a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 ...Q)n......6.b.
032 3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b =..^..g....i..r.
048 1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36 .q.....)....~.;6
064 92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58 ....-w......(..X
080 fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc ..$...u.U...H1..
096 3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b ?....Kz..v.e...K
112 61 16 a.
AEAD Construction for Poly1305:
000 50 51 52 53 c0 c1 c2 c3 c4 c5 c6 c7 00 00 00 00 PQRS............
016 d3 1a 8d 34 64 8e 60 db 7b 86 af bc 53 ef 7e c2 ...4d.`.{...S.~.
032 a4 ad ed 51 29 6e 08 fe a9 e2 b5 a7 36 ee 62 d6 ...Q)n......6.b.
048 3d be a4 5e 8c a9 67 12 82 fa fb 69 da 92 72 8b =..^..g....i..r.
064 1a 71 de 0a 9e 06 0b 29 05 d6 a5 b6 7e cd 3b 36 .q.....)....~.;6
080 92 dd bd 7f 2d 77 8b 8c 98 03 ae e3 28 09 1b 58 ....-w......(..X
096 fa b3 24 e4 fa d6 75 94 55 85 80 8b 48 31 d7 bc ..$...u.U...H1..
112 3f f4 de f0 8e 4b 7a 9d e5 76 d2 65 86 ce c6 4b ?....Kz..v.e...K
128 61 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
144 0c 00 00 00 00 00 00 00 72 00 00 00 00 00 00 00 ........r.......
Beachte die vier Nullbytes in Zeile 000 und die 14 Nullbytes in Zeile 128.
Tag:
1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91