NIST テストベクタ

NIST (米国国立標準技術研究所) が暗号アルゴリズムの仕様書と一緒に公開している公式のテスト入出力データ。

何であるか

「この鍵とこの平文を入れたら、この暗号文が出なければならない」という正解セット。実装が仕様通りに動いているかを検証するためのもの。世界中の暗号実装がこれで検証しており、ここを通れば基本的な正しさは担保できる。

NIST はアルゴリズムごとに仕様書 (FIPS / SP) を発行し、その付録やコンパニオンドキュメントとしてテストベクタを同梱する。CAVP (Cryptographic Algorithm Validation Program) はこれをさらに体系化した公式検証プログラムで、商用製品が暗号モジュール認証 (FIPS 140) を取得する際にも使われる。

なぜ重要か

ただしベクタが通ることは必要条件であって十分条件ではない。サイドチャネル攻撃耐性やパディング処理の正しさなど、ベクタだけではカバーできない領域がある。

代表的なベクタ

FIPS 197 Appendix B — AES ブロック暗号の基本テスト

AES-128 の単一ブロック暗号化。最も基本的なベクタ。

項目値
鍵2B7E151628AED2A6ABF7158809CF4F3C
平文3243F6A8885A308D31319802E0370734
正解 (暗号文)3925841D02DC09FBDC118597196A0B32

ソース: FIPS 197 — Advanced Encryption Standard (AES), Appendix B

SP 800-38A F.3.7 — AES-CFB8 モードのテスト

ブロック暗号の運用モードの一つ CFB8 のベクタ。ストリーム的に1バイトずつ暗号化する。

項目値
鍵2B7E151628AED2A6ABF7158809CF4F3C
IV000102030405060708090A0B0C0D0E0F
平文6BC1BEE2
正解 (暗号文)3B79424C

ソース: SP 800-38A — Recommendation for Block Cipher Modes of Operation, Section F.3.7

使い方

テストコードで NIST ベクタの入力を自前の実装に通し、出力が正解と一致するかを比較する。一致しなければ実装にバグがある。

// 例: Rust でのベクタ検証
#[test]
fn test_aes128_fips197_appendix_b() {
    let key = hex!("2B7E151628AED2A6ABF7158809CF4F3C");
    let plaintext = hex!("3243F6A8885A308D31319802E0370734");
    let expected = hex!("3925841D02DC09FBDC118597196A0B32");

    let ciphertext = aes128_encrypt(&key, &plaintext);
    assert_eq!(ciphertext, expected);
}

他のアルゴリズムのベクタ

NIST は AES 以外にも多数のベクタを公開している。

アルゴリズム文書内容
SHA-2FIPS 180-4ハッシュ関数 (SHA-256, SHA-512 等)
SHA-3FIPS 202Keccak ベースのハッシュ
AES-GCMSP 800-38D認証付き暗号
HMACFIPS 198-1鍵付きハッシュ
ECDSAFIPS 186-5楕円曲線デジタル署名

CAVP が提供する全ベクタの一覧: CAVP Testing: Block Ciphers

参考リンク

Graph