2.8 AEAD Construction (AEAD 構成)
2.8 AEAD Construction (AEAD 構成)
AEAD_CHACHA20_POLY1305 は, 追加データ付き認証暗号 (Authenticated Encryption with Associated Data, AEAD) アルゴリズムである. AEAD_CHACHA20_POLY1305 への入力は次のとおりである:
-
256 ビット鍵
-
96 ビット nonce, 同一鍵での各呼び出しごとに異なるもの
-
任意長の plaintext
-
任意長の追加認証データ (Additional Authenticated Data, AAD)
一部のプロトコルでは, 呼び出しごとに一意だが 96 ビット長ではない入力を持つ場合がある. 例えば IPsec は 64 ビット nonce を指定することがある. そのような場合, プロトコル文書が, プロトコル nonce を 96 ビット nonce にどう変換するか (例えば定数値を連結するなど) を定義する責任を負う.
ChaCha20 と Poly1305 のプリミティブは, 256 ビット鍵と 96 ビット nonce を取る AEAD に次のように組み合わせる:
-
まず, 第 2.6 節に記述された手順に従い, 256 ビット鍵と nonce から Poly1305 のワンタイム鍵を生成する.
-
次に, ChaCha20 暗号化関数を呼び出して plaintext を暗号化する. 同一の鍵と nonce を用い, 初期カウンタは 1 に設定する.
-
最後に, 上で算出した Poly1305 鍵を用いて Poly1305 関数を呼び出し, メッセージ引数として次を連結して構成する:
-
AAD
-
padding1, 最大 15 ゼロバイトのパディングであり, それまでの合計長を 16 の整数倍にする. AAD の長さがすでに 16 バイトの整数倍であれば, このフィールドの長さはゼロである.
-
ciphertext
-
padding2, 最大 15 ゼロバイトのパディングであり, それまでの合計長を 16 の整数倍にする. ciphertext の長さがすでに 16 バイトの整数倍であれば, このフィールドの長さはゼロである.
-
追加データのオクテット長 (64 ビットリトルエンディアン整数).
-
ciphertext のオクテット長 (64 ビットリトルエンディアン整数).
-
AEAD の出力は次の連結である:
-
plaintext と同じ長さの ciphertext.
-
128 ビット tag, Poly1305 関数の出力.
復号は同様だが, 次の点が異なる:
-
ciphertext と plaintext の役割が逆になり, ChaCha20 暗号化関数を ciphertext に適用して plaintext を得る.
-
Poly1305 関数は引き続き AAD と ciphertext に対して実行し, plaintext には対して実行しない.
-
算出した tag を受信した tag とビット単位で比較する. 2 つの tag が一致するとき, かつそのときに限りメッセージは認証される.
本設計に関する注記:
-
単一呼び出しで暗号化可能なデータ量は, ChaCha20 ブロック関数におけるブロックカウンタフィールドの大きさのため, 最大で
2^32-1個の 64 バイトブロックである. 合計 274,877,906,880 バイト, 約 256 GB となる. IPsec や TLS のようなトラフィックプロトコルには十分だが, ファイルやディスク暗号化には小さすぎる場合がある. そのような用途では, 元の設計に戻り nonce を 64 ビットに減らし, 位置 13 の整数を 64 ビットブロックカウンタの上位 32 ビットとして用いることで, 総メッセージサイズを 100 万 PB 超 (正確には 1,180,591,620,717,411,303,360 バイト) にまで増やせる. -
前項にもかかわらず, Poly1305 が動作するバッファの構築における ciphertext 長フィールドは, ciphertext (したがって plaintext) のサイズを
2^64バイト, すなわち 1 万 6000 PB (正確には 18,446,744,073,709,551,616 バイト) に制限する.
本節の AEAD 構成は ChaCha20 と Poly1305 の新しい合成である. この合成に対するセキュリティ解析は [Procter] に示されている.
以下に, [RFC5116] 第 4 節で定義される本構成のパラメータ一覧を示す:
-
K_LEN (鍵長) は 32 オクテット.
-
P_MAX (plaintext の最大サイズ) は 274,877,906,880 バイト, 約 256 GB.
-
A_MAX (関連データの最大サイズ) は, 関連データの長さフィールドにより
2^64-1オクテットに設定される. -
N_MIN = N_MAX = 12 オクテット.
-
C_MAX = P_MAX + tag 長 = 274,877,906,896 オクテット.
([RFC5116] 第 3.3 節に記述のとおり) 異なる AAD 入力は, AEAD_CHACHA20_POLY1305 への単一の入力へ連結しなければならない. AAD 入力に構造が必要な場合は, アプリケーションが作成する.
2.8.1 Pseudocode for the AEAD Construction (AEAD 構成の疑似コード)
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 (テストベクトル例)
テストベクトルとして, AEAD_CHACHA20_POLY1305 関数に次の入力を用いる:
明文:
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........
鍵:
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 ....
Poly1305 ワンタイム鍵生成の設定 (送信者 id=7):
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000007 43424140 47464544
Poly1305 ワンタイム鍵生成後:
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
キーストリームバイト列:
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
暗号文:
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.
Poly1305 用 AEAD 構成:
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.......
000 行目の 4 ゼロバイトと 128 行目の 14 ゼロバイトに注意すること.
タグ:
1a:e1:0b:59:4f:09:e2:6a:7e:90:2e:cb:d0:60:06:91