組み込み向け案件で、セキュリティ周りでCTR-DRBGを使う場面がでてきたので、調べがてらメモを残してみる。
想定読者
CTR-DRBGを使う場面に直面しているが、原文読むのがつらい人向け(要は自分という・・・)。
前提知識と心構えをざっくりと:
- 情報工学の基礎知識がある(ビット演算とか)
- 真性乱数と疑似乱数の違いが説明できる
- AES(Advanced Encryption Standard)を知っている
- セキュリティに対するアレルギーがない(Web系のセキュリティ知識は不要)
この記事の使いかた
原文を読む際の手助けとしての利用を想定しています。(本記事だけでは情報が不足していますので原文を合わせて読んでください。)
※間違っていても責任はとれません。
参考文献を頭から読まずに、さらに斜め読みしているので色々抜けてるかもです。
間違いがありましたら指摘いただけると助かります!
参考文献(原文)
NIST SP 800-38A (Recommendation for Block Cipher Modes of Operation Methods and Techniques)
本記事では2001年版の内容に沿います。NIST SP 800-90A (Recommendation for Random Number Generation Using Deterministic Random Bit Generators)
本記事ではJan-2012版の内容に沿います。
概要
CTR-DRBG - 要はカウンタ(CTR)とブロック暗号(AESなど)を使って疑似乱数を作るアルゴリズム。
NIST文書中の略語
略語 | 非省略形 | 説明 |
---|---|---|
CTR | Counter | カウンターモード。ブロック暗号(AESなど)をどういう風に利用するかを示す分類と捉えておけば、とりあえず おk |
DRGB | Deterministic Random Bit Generator | 疑似乱数だと捉えておけば、とりあえず おk |
NIST SP 800-38Aに記載されているCTRを読み解く
DRBGに入る前に、NIST SP 800-38Aに記載されている、ブロック暗号を使ったCTRの推奨例について調べた。
(NIST SP 800-90Aから同-38Aを参照しているため。)
なお、38AのほうはRecommendation(推奨)であり、仕様規定ではないようである。(違ってたらすみません。指摘ください。)
CTRでの入力データの区切り方
NIST SP 800-38A 2001 Editionの5.2章Representation of the Plaintext and the Ciphertextを解釈した結果を記載する。
記号 | 説明 |
---|---|
b | Blockのbit長。AES128を使う場合は128 |
n | Blockの個数 |
u | 最後のBlockのbit数。 |
CTRモードではPadding(38AのAppendix Aに書いてある)は使わない。
CTRのデータの流れ
NIST SP 800-38A 2001 Editionの6.5章The Counter Modeを解釈した結果を記載する。
- AES128のところは、使用するブロック暗号アルゴリズムにより異なる。
- bit数も使用するアルゴリズムやパラメータにより異なる。
-
+1
は例。
カウンターの初期値(counter1)の選び方
NIST SP 800-38A 2001 EditionのB.2 Choosing Initial Counter Blocksを解釈した結果を記載する。
B.2章の冒頭の文章1:
指定されたキーで暗号化される各メッセージの初期カウンターブロックT1は、すべてのメッセージにわたってすべてのカウンターブロックの一意性を保証する方法で選択する必要があります。このセクションでは、初期カウンターブロックを選択するアプローチの2つの例を示します。
カウンターの初期値(counter1)の選び方のアプローチ(例として記載されている)
【1つ目のアプローチ】
単純なインクリメントカウンタっぽい。本文中のmはカウンタのbit長。
【2つ目のアプローチ】
ブロックサイズ(b bit)の半分(AES128なら64bit)のNonce(1回だけ生成する乱数)をインプットとして使う。
NIST SP 800-90Aに記載されているCTR-DRBGを読み解く
10.2.1章CTR_DRBG
疑似乱数を一定数生成したら、真性乱数を使用してReseed2するステップを踏むようである。
読解中・・
10.2.1.5章Generating Pseudorandom Bits Using CTR_DRBG が本体
-
Google翻訳した結果をそのまま記載した。内容は合っていそうだがよく分からん。。コーディングしてTest Vector流せばすっきり分かるような予感。 ↩
-
疑似乱数は決められた計算で生成するため、一般的に、初期状態を真性乱数で作り出す必要がある(乱数列を再現したい場合は固定値にしたりすることもある)。その初期状態をつくるデータをシードと呼ぶ(自分の理解はこれ)。定義はどこに書かれているかわからないですが、シードの意義は https://www.jpcert.or.jp/sc-rules/c-msc32-c.html などを参照してください。 ↩