2.6 Generating the Poly1305 Key Using ChaCha20 (ChaCha20 による Poly1305 鍵の生成)
2.6 Generating the Poly1305 Key Using ChaCha20 (ChaCha20 による Poly1305 鍵の生成)
第 2.5 節で述べたとおり, ワンタイム Poly1305 鍵を疑似乱数的に生成することは許容される。本節ではそのような方法を定義する。
そのような鍵のペア (r,s) を生成するには, 第 2.3 節で説明する ChaCha20 ブロック関数を用いる。これは, Message Authentication Code (メッセージ認証コード, MAC) 関数専用の 256 ビットセッション鍵を有していることを前提とする。あるプロトコルにおいて Poly1305 を MAC アルゴリズムとして用いることを規定する文書は, 整合性鍵に 256 ビットを割り当てることを指定しなければならない。第 2.8 節で定義される AEAD (Authenticated Encryption with Associated Data, 関連データ付き認証暗号) 構成では, 暗号化と鍵生成に同じ鍵が用いられることに注意すること。
この方法は, 次のパラメータでブロック関数を呼び出す。
-
256 ビットのセッション整合性鍵を ChaCha20 鍵として用いる。
-
ブロックカウンタをゼロに設定する。
-
プロトコルは 96 ビットまたは 64 ビットの nonce を規定する。同一鍵での各呼び出しごとに一意でなければならないため, 乱数生成してはならない。カウンタによる実装は適切な方法の一つだが, Linear Feedback Shift Register (線形フィードバックシフトレジスタ, LFSR) など他の方法も許容される。本書で規定する ChaCha20 は 96 ビットの nonce を要する。したがって, 与えられる nonce が 64 ビットのみの場合は, nonce の先頭 32 ビットを定数に設定する。通常はゼロだが, 複数の送信者がいるプロトコルでは送信者ごとに異なる値になり得る。ただし, 特定の送信者による同一鍵での当該関数の全呼び出しについては, 同じ値であるべきである。
ブロック関数の実行後, 512 ビットの状態が得られる。系列化された状態の先頭 256 ビットを取り, ワンタイム Poly1305 鍵として用いる: 先頭 128 ビットをクランプして "r" とし, 続く 128 ビットが "s" となる。残りの 256 ビットは破棄する。
多くのプロトコルは暗号アルゴリズム用の nonce (しばしば Initialization Vector (初期化ベクトル, IV) と呼ばれる) の規定を持つが, MAC 関数用の同様の規定を持たないことが多い。その場合, 呼び出しごとの nonce は, メッセージカウンタなど, 別の場所から供給されなければならない。
2.6.1 Poly1305 Key Generation in Pseudocode (Poly1305 鍵生成の疑似コード)
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 (Poly1305 鍵生成のテストベクタ)
本例では, 次のように設定する:
鍵:
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 ............
鍵, nonce, ブロックカウンタゼロでの ChaCha 状態の初期設定:
61707865 3320646e 79622d32 6b206574
83828180 87868584 8b8a8988 8f8e8d8c
93929190 97969594 9b9a9998 9f9e9d9c
00000000 00000000 03020100 07060504
20 ラウンド後の ChaCha 状態:
8ba0d58a cc815f90 27405081 7194b24a
37b633a8 a50dfde3 e2b8db08 46a6d1fd
7da03782 9183a233 148ad271 b46773d1
3cc1875a 8607def1 ca5c3086 7085eb87
出力バイト:
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
この出力は, Poly1305 用の 32 バイトワンタイム鍵でもある。