要約
- RFC 2040で実行可能なRC5を特定するには、
W、R、b、鍵バイト、モード、IV、終端ブロック規則を一体として記録する必要がある。 - サンプルコード、ASN.1、テストベクトルが示すのは特定入力に対する一致であり、安全性、乱数品質、IVの一意性、実効的なメモリ消去、配備、現在の妥当性ではない。
Robert BaldwinとRonald Rivestが1996年10月に公表したRFC 2040は、RC5、RC5-CBC、RC5-CBC-Pad、RC5-CTSという四つの構成を、相互運用に足る詳細で定義すると宣言した。RFC Editorの記録上の位置づけはInformationalであり、Internet Standardではない。本文自身も、先行するRC5論文や既存のCBC、パディング記述を再構成したものだと説明している。
したがって、この文書の仕事はRC5の起源を主張することではない。同じ名前を掲げる二つのプログラムが、どの条件で同じバイト列に到達するかを明文化することだった。
ブランド名ではなくパラメータ集合
Wは語長、Bはその2倍のブロック長、BBはブロック長をバイトで表した値である。Rはラウンド数、bはユーザー鍵のバイト長、Kは実際の鍵バイト列だ。展開鍵SにはT = 2(R+1)個の語が並ぶ。CBCにはさらに1ブロック分の初期化ベクトルIが加わる。
二つの実装がともに「RC5」と名乗っても、WやR、鍵長、鍵バイトの並べ方、モード、IV、終端規則のどれかが違えば別の結果になる。W/R/bが一致していても、結び付けた鍵バイトが違えば同一ではない。
鍵展開はこの依存関係を露出させる。RFCはKをリトルエンディアンで語配列へ入れ、Wに依存する定数でSを初期化し、双方の長い方の3倍の回数だけ混合する。例示コードは具体化のため64ビットブロックに固定されている。その出力が検証するのは、この経路であって全パラメータ空間ではない。
オブジェクトが隠れた状態を可視化する
説明は鍵オブジェクトと暗号オブジェクトに分かれる。CBCオブジェクトは、パディングの有無、ラウンド数、展開鍵、元のIV、現在の連鎖ブロック、未完成の入力ブロックと位置を保持する。
Encrypt_Initは鍵を結合して展開し、IVから連鎖状態を復元する。SetIVは展開鍵を保ったままIVを入れ替え、入力位置と連鎖を初期化する。Updateは分割された入力を順番に受け取り、1ブロックに満たない分を保持する。満ちた時点で連鎖ブロックとXORし、RC5で暗号化し、その結果を次の連鎖状態にする。
Finalは単なる後片付けではない。通常のCBCでは残りのバイトがあればエラーになる。CBC-Padでは必ず最終ブロックを作り、1からBB個のバイトを追加する。各バイトの値は追加数と同じで、すでに整列したメッセージにも丸ごと1ブロックが加わる。終端処理そのものが暗号の同一性に含まれる。
最後の二つの部分で機械が分かれる
通常のCBCはブロック長の倍数だけを受け付ける。CBC-Padは出力を伸ばして任意長を表す。CTSは長さを保つ代わりに最後の二部分を組み替える。連鎖した最後から二番目の完全ブロックを暗号化し、その中間値の先頭から必要な長さを最終短縮暗号文として取り出す。最後の平文断片をゼロで満たして中間値とXORし、もう一度暗号化した完全ブロックを短縮断片の前に置く。
この構造のため、CTS実装はFinalまで最大2ブロックを保持しなければならない。途中では、目の前の完全ブロックが本当に最後から二番目なのか、何バイトを移すのか確定しない。
実装可能な読み方には検証済みの正誤表が欠かせない。Errata 513は対象を「1ブロックより長い平文」に訂正する。514は先行暗号文ブロックがない短い場合にIVを使うと補う。587は復号手順に欠けていたXORと同じIV規則を戻す。元の文面だけに忠実なコードは、境界条件で別の結果を出し得る。
テストベクトルが観測した範囲
第9節は目的を「実装の正しさを確認する助け」と限定する。提示されたプログラムは8バイトブロックを使い、パディングフラグ、ラウンド数、鍵バイト、8バイトIV、平文を読み、期待暗号文を示す。
一致すれば、その入力の組について、鍵の変換、展開、ブロック変換、CBC連鎖、終端処理を合わせた経路が文書と一致したと言える。不一致ならどこかの合意が崩れたと分かるが、最終出力だけでは故障箇所を特定できない。
また、掲載結果はCBCとCBC-Padだけで、CTSベクトルはない。鍵やIVの生成過程、IVの一意性、暗号強度、APIの使い方、コンパイラ後の消去、プロトコルへの組み込み、実運用は一切観測していない。バイト比較からそれらを推論することはできない。
ASN.1は実行環境の一部しか運ばない
第11節はCBCとCBC-Padに末尾8、9のOIDアークを割り当て、版、ラウンド数、ブロック長、任意のIVをパラメータ列に持たせる。IVがなければ対応長のゼロブロックを既定値とする。Errata 6380はASN.1の名前、大小文字、制約構文を修正したが、情報を増やしたわけではない。
この列にはb、鍵バイト、展開鍵は含まれず、CTSの識別子もない。OIDは解釈契約の一部を固定できても、実行された機械全体を同定できない。ゼロIVの既定規則は符号化の読み方を示すだけで、現実のIVがランダムまたは一意だった証拠にはならない。
ソースの意図と機械上の事実を分ける
破棄関数の例は解放前にメモリへゼロを書く。これはソース上の指示を示すが、最適化後にも書き込みが残ったか、別の複製まで消えたかは示さない。1996年の安全性や特許に関する文章も、当時の記録であって現在の評価ではない。
RFC 2040の強さは、相互運用に必要な選択を列挙し、検査可能にした点にある。その強さを保つには、再現可能な変換を安全性や配備の証明へ拡張しないことが必要だ。
出典
会員向け解説
プロフィールの詳細
適切な会員レベルでログインすると、解説全文と出典メモをご覧いただけます。
Strategic Circle 限定
Strategic Circle
すべての読者に公開されています。参加してログインすると プロフィール解説 を閲覧できます。
Strategic Circle に参加Leadership Alliance 会員限定
Leadership Alliance
対象となる IP 資産の所有者・管理者向けです。ログインすると Leadership Alliance の解説を閲覧できます。
Leadership Alliance に参加

