Upgrade to Pro — share decks privately, control downloads, hide ads and more …

QuasiなCyclicを笑いながらハミング

Avatar for mitsu mitsu
September 23, 2025

 QuasiなCyclicを笑いながらハミング

HQC の概要と DFR の解析について解説

Avatar for mitsu

mitsu

September 23, 2025
Tweet

More Decks by mitsu

Other Decks in Technology

Transcript

  1. 本当のご注意 符号の表現方法として、主に多項式と行列によるものがある  めっちゃ自然に同一視して説明すると思われる  符号に馴染みがないと混乱しやすいが、変換可能な議論なので安心していいヨ! 𝑅 = 𝔽𝑞 𝑋

    / 𝑋𝑛 − 1 と𝔽𝑞 𝑛の間には標準的な同型がある  Φ: 𝔽𝑞 𝑛 ∋ 𝑎0 , ⋯ , 𝑎𝑛−1 ↦ 𝑎0 + 𝑎1 𝑋 + ⋯ 𝑎𝑛−1 𝑋𝑛−1 mod (𝑋𝑛 − 1) ∈ 𝑅 よくある操作として  Φ RotL𝑛 𝒂 = 𝑋𝑛 ⋅ Φ 𝒂 mod (𝑋𝑛 − 1)  生成多項式と生成行列の変換 𝒈 𝑋 = 𝑎0 + 𝑎1 𝑋 + ⋯ + 𝑎𝑛−1 𝑋𝑛−1 mod 𝑋𝑛 − 1 𝑮 = Φ−1 𝒈 𝑋 Φ−1 𝑋 ⋅ 𝒈 𝑋 ⋮ Φ−1 𝑋𝑘−1 ⋅ 𝒈 𝑋 同じものだと 思えばいいニョ!
  2. REED-MULLER符号  多値への拡張も可能な二元符号 RM 𝑟, 𝑚  𝑛 = 2𝑚,

    𝑘 = σ𝑖 𝑟 𝑚 𝑖 , 𝑑min = 2𝑚−𝑟  特に 𝑟 = 1 でアダマール符号  組み合わせの多項式{1, 𝑋1 , ⋯ , 𝑋𝑚 , ⋯ , 𝑋𝑖 𝑋𝑗 , ⋯ , 𝑋𝑖 𝑋𝑗 𝑋𝑘 , ⋯ }から生成  RM(1, 3)なら、 1, 𝑋1 , 𝑋2 , 𝑋3  3ビット全体 (0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)  各多項式の対応するビットを行とする  1は11111111  𝑋1 :1ビット目を見ると 00001111  𝑋2 :2ビット目を見ると 00110011  𝑋3 :3ビット目を見ると 01010101 𝑮 = 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1
  3. REED-MULLER符号  生成行列を再帰的に組み立てるテクも(Plotkin構成)  𝐴 ∣ 𝐵 ≔ { 𝒖,

    𝒖 + 𝒗 | 𝒖 ∈ 𝐴, 𝒗 ∈ 𝐵} (bar product)  bar product について RM 𝑟, 𝑚 = RM 𝑟, 𝑚 − 1 ∣ RM 𝑟 − 1, 𝑚 − 1  これにより 𝑮 0, 𝑚 = 1 1 1 … 1 𝑮 𝑟, 0 = 1 𝑮 𝑟, 𝑚 = 𝑮 𝑟, 𝑚 − 1 𝑮 𝑟, 𝑚 − 1 0 𝑮 𝑟 − 1, 𝑚 − 1  処理が速い  ハードウェアと相性が良い  𝑟を小さくとれば𝑑min が爆増!!!  ただし設計の柔軟性、冗長性とトレードオフ  大雑把だが強力な訂正能力
  4. REED-SOLOMON符号  多値符号 R𝑆 𝑛, 𝑘  𝑛 = 𝑛,

    𝑘 = 𝑘, 𝑑min = 𝑛 − 𝑘 + 1  DFT行列から切り出して、パリティ検査行列を生成 𝑫 = 𝜔0 0 𝜔0 1 𝜔0 2 ⋯ 𝜔0 𝑛−1 𝜔1 0 𝜔1 1 𝜔1 2 ⋯ 𝜔1 𝑛−1 ⋮ ⋮ ⋮ ⋱ ⋮ 𝜔𝑛−1 0 𝜔𝑛−1 1 𝜔𝑛−1 2 ⋯ 𝜔𝑛−1 𝑛−1 誤り訂正能力が高い まあ、早い (でも多値だからちょっと遅い) 𝑯
  5. 連接符号 符号化アルゴリズムを掛け合わせて、柔軟に構成 特に「二元符号 × 多値符号」  HQCでは「Reed-Muller符号×Reed-Solomon符号」  多値符号が external

    code  二元符号が inner code  external code で全体を符号化 + 得られた各シンボルを inner code でさらに符号化 符号の組み合わせだと 積符号というのもあるニョ!
  6. なぜRMRSの連接符号?  Reed-Muller符号は高速アダマール変換で高速な復号が可能  Reed-Solomon符号もユークリッド復号などで効率的な処理が可能  DFR(復号失敗率)の設計が容易でモデル化しやすい 元々は「BCH符号 × 反復符号」だったが、Round

    3にて切り替え  これによりDFRが下がり鍵サイズが縮小できた ちなみに、主要な変更点絡みだと Round 4でmulti-ciphertext attack耐性とimplicit rejection が追加されたニョ……
  7. 巡回符号  符号𝐶で、∀𝒄 𝑋 ∈ 𝐶について𝑋 ⋅ 𝒄 𝑋 ∈

    𝐶であるもの 組織符号  端的には、符号が情報パートと検査パートに分かれているもの  生成行列とパリティ検査行列はこんな感じになる  𝑮 = 1 ⋱ 1 𝑨0 ⋮ 𝑨𝑘−1 𝑯 = 𝑨0 𝑇 ⋯ 𝑨𝑘−1 𝑇 1 ⋱ 1 元の情報 𝑎0 ⋯ 𝑎𝑘−1 符号化後 𝑎0 ⋯ 𝑎𝑘−1 ℎ0 ⋯ ℎ𝑚−1 情報シンボル 検査シンボル
  8. 準巡回符号(Quasi-Cyclic Codes)  端的に言えば  全体のシンボル数 𝑠 ⋅ 𝑛 

    𝑛シンボルごとに巡回可能な符号 組織準巡回符号  準巡回符号かつ組織符号なやつ 𝑎0,0 ⋯ 𝑎0,𝑛−1 𝑎1,0 ⋯ 𝑎1,𝑛−1 𝑎2,0 ⋯ 𝑎𝑠−1,𝑛−1 sブロック s=2の設計例 𝑯 = 1 ℎ0 ℎ𝑛−1 ⋯ ℎ1 1 ℎ1 ℎ0 ⋯ ℎ2 ⋱ ⋮ ⋮ ⋱ ⋮ 1 ℎ𝑛−1 ℎ𝑛−2 ⋯ ℎ0 = 𝑰𝑛 rot 𝒉 s=3の設計例 𝑯 = 𝑰𝒏 𝟎 rot 𝒉 𝟎 𝑰𝒏 rot 𝒉
  9. シンドローム復号問題 シンドローム:𝒙 ∈ 𝔽𝑞 𝑛に対しパリティ検査行列をかけたもの 𝒔 = 𝑯𝒙𝑇 線形符号では、このシンドロームのパターンから誤り訂正を行う 

    例えば𝒔 = 1 1 0 なら情報シンボルの1シンボル目が誤ってますよ~  特にパリティ検査行列の定義から𝒔 = 0 0 0 なら誤りが無い  3bit の検査シンボルなら8パターンの誤りシンボルの位置を表現できる  誤り無しを含め、全体7bitまでなら誤り位置をシンドロームで表現可能 シンドロームが表現可能なパターン数以上の誤りは、 別パターンの誤りだと誤認してしまう  情報理論的に訂正不能なシンボル数が存在  訂正不能なシンボル数より大きいエラーを混ぜ込めば、復号できなくなる 右も向けるニョ! (余談)
  10. シンドローム復号問題 計算シンドローム復号問題(Computational SD問題) 𝑆𝐷 𝑛, 𝑘, 𝜔  𝑛:シンボル数 

    𝑘:情報シンボル数  𝜔:重み パリティ検査行列 𝑯 と、シンドローム 𝒚 から 𝒚𝑇 = 𝑯𝒙𝑇となるノルム𝜔のベクトル𝒙を計算する問題
  11. シンドローム復号問題 判定シンドローム復号問題(Decisional SD問題) 組 𝑯, 𝒚 ∈ 𝔽 𝟐 𝑛

    𝑛−𝑘 × 𝔽2 𝑛−𝑘が与えられたとき  𝑯がパリティ検査行列かつ𝒚がそのシンドロームである  𝑯, 𝒚 はランダムサンプリングによるもの を判定する問題 ノルムがハミング重みの場合、 SD問題はいずれも NP完全 ニョホホホホ! (一方向性のオタク)
  12. 特殊な操作 𝑛次のベクトルの積 𝒘 = 𝒖 ⋅ 𝒗 𝑤𝑡 ≔ ෍

    𝑖+𝑗≡𝑡 𝑚𝑜𝑑 𝑛 𝑢𝑖 ⋅ 𝑣𝑖 前に出てきたrot ⋅ を使うと rot 𝒗 = 𝑣0 𝑣𝑛−1 ⋯ 𝑣1 𝑣1 𝑣0 ⋯ 𝑣2 ⋮ ⋮ ⋱ ⋮ 𝑣𝑛−1 𝑣𝑛−2 ⋯ 𝑣0 なので 𝒘 = 𝒖 rot 𝒗 𝑇 畳み込みみたいな ものだね
  13. 特殊な操作 Truncate 𝒖, 𝑙 𝒖 の下位 𝑙 ビットを切り出す処理 𝔽2 𝑛

    → 𝔽2 𝑙 の射影だね。 DilithiumとかのTruncateとは異なるから注意
  14. 鍵生成 𝑅𝜔 ≔ 𝒗 ∈ 𝔽2 𝑋 / 𝑋𝑛 −

    1 𝒗 = 𝜔} 秘密鍵:𝒙, 𝒚  𝒙 ←𝑋𝑂𝐹 𝑅𝜔  𝒚 ←𝑋𝑂𝐹 𝑅𝜔 公開鍵:𝒔, 𝒉(より厳密にはXOFのシード)  𝒉 ←𝑋𝑂𝐹 𝔽𝟐 𝑿 / 𝑋𝑛 − 1  𝒔 = 𝒙 + 𝒉 ⋅ 𝒚
  15. 暗号化 1. 𝜃 = Sha3256 Sha3256 𝒔 || 𝒉 ||

    𝑚 || salt 2. 𝒓1 ←𝑋𝑂𝐹 𝜃 𝑅𝜔𝑟 3. 𝒓2 ←𝑋𝑂𝐹 𝜃 𝑅𝜔𝑟 4. 𝒆 ←𝑋𝑂𝐹 𝜃 𝑅𝜔𝑒 5. 𝒖 = 𝒓𝟏 + 𝒉 ⋅ 𝒓𝟐 6. 𝒗 = RMRS 𝑚 + Truncate 𝒔 ⋅ 𝒓𝟐 + 𝒆, 𝑙 Input: 𝒔, 𝒉, 𝑚, salt Output: 𝑐 = 𝒖, 𝒗 左をやるだけ
  16. 復号 1. 𝑚 = RMRS−1 𝒗 − Truncate 𝒖 ⋅

    𝒚, 𝑙 𝒖 ⋅ 𝒚 = 𝒔 ⋅ 𝒓𝟐 + 𝒆は一般には成り立たない!  この二式の差が、誤り訂正可能な範囲に収まっていればいい Input: 𝒚, 𝒖, 𝒗 Output: 𝑚 暗号化は 𝒗 = RMRS 𝑚 + Truncate 𝒔 ⋅ 𝒓𝟐 + 𝒆, 𝑙 だったね
  17. 復号可能な理由 Truncate の線形性  Truncate 𝒖 ± 𝒗, 𝑙 =

    Truncate 𝒖, 𝑙 ± Truncate 𝒗, 𝑙  これは𝔽2 𝑛 → 𝔽2 𝑙 への射影なのでそう ベクトル積の可換性(𝑅は演算 +,⋅ で可換環)  𝒖 ⋅ 𝒗 = 𝒖 rot 𝒗 𝑇 = rot 𝒖 𝒗𝑇 𝑇 = 𝒗 rot 𝒖 𝑇 = 𝒗 ⋅ 𝒖 これより Truncate 𝒔 ⋅ 𝒓𝟐 + 𝒆, 𝑙 − Truncate 𝒖 ⋅ 𝒚, 𝑙 = Truncate 𝒔 ⋅ 𝒓𝟐 + 𝒆 − 𝒖 ⋅ 𝒚, 𝑙 = Truncate (𝒙 + 𝒉 ⋅ 𝒚 ⋅ 𝒓𝟐 + 𝒆 = Truncate 𝒙 ⋅ 𝒓𝟐 − 𝒓𝟏 ⋅ 𝒚 + 𝒆, 𝑙 これで復号できるの、 結構非自明です → 𝒉の項が消える
  18. 復号可能な理由 Truncate 𝒔 ⋅ 𝒓𝟐 + 𝒆, 𝑙 − Truncate

    𝒖 ⋅ 𝒚, 𝑙 = Truncate 𝒙 ⋅ 𝒓𝟐 − 𝒓𝟏 ⋅ 𝒚 + 𝒆, 𝑙 よって 𝒗 − Truncate 𝒖 ⋅ 𝒚, 𝑙 = RMRS 𝑚 + Truncate 𝒙 ⋅ 𝒓𝟐 − 𝒓𝟏 ⋅ 𝒚 + 𝒆, 𝑙 𝒆′ = 𝒙 ⋅ 𝒓𝟐 − 𝒓𝟏 ⋅ 𝒚 + 𝒆 のノルムが気になる!! → DFR(復号失敗率)の解析と直接結びつく話
  19. 命題 𝒙 ←𝑈 𝑅𝜔 、𝒓 ←𝑈 𝑅𝜔𝑟 で 𝒙と𝒓は独立 𝒛

    = 𝒙 ⋅ 𝒓とするとき、𝑧𝑘 は ෤ 𝑝 = Pr 𝑧𝑘 = 1 のベルヌーイ分布に従う ただし ෤ 𝑝 = 1 𝑛 𝜔 𝑛 𝜔𝑟 ෍ 1≤𝑙≤min(𝜔,𝜔𝑟) 𝑙 is 𝑜𝑑𝑑 𝑛 𝑙 𝑛 − 𝑙 𝜔 − 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙 (迫真)
  20. まずは𝑧0 について 𝒙の1のビットのインデックスの集合𝑆  𝑆 = 𝜔 𝒓の1のビットのインデックスの集合𝑇  𝑇

    = 𝜔𝑟 𝑧0 = σ𝑖 𝑥𝑖 ⋅ 𝑟−𝑖 mod 𝑛 なので 𝑧0 = 1 ⇔ 𝑆 ∩ 𝑇0 is 𝑜𝑑𝑑  ただし𝑇0 = −𝑖 mod 𝑛 | 𝑖 ∈ 𝑇
  21. 𝐿 = 𝑆 ∩ 𝑇0 の分布は?  インデックス全体から𝜔𝑟 個のインデックスを非復元抽出したとき、 𝑆の要素と何個共通するか?

    超幾何分布!!  母集団 0, ⋯ , 𝑛 − 1  𝑁 = 𝑛  成功状態の集合𝑆  𝐾 = 𝜔  抽出数𝑛 = 𝜔𝑟 超幾何分布の確立質量関数 Pr 𝐿 = 𝑙 = 𝐾 𝑙 𝑁 − 𝐾 𝑛 − 𝑙 𝑁 𝑛 = 𝜔 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙 𝑛 𝜔𝑟 ちなみに、HQC公式の証明は 組み合わせパターン数ごり押し
  22. よって𝑧0 が1になる分布は Pr 𝑧0 = 1 = ෍ 1≤𝑙≤min 𝜔,𝜔𝑟

    𝑙 is 𝑜𝑑𝑑 𝜔 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙 𝑛 𝜔𝑟 さらに 𝑛 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙 = 𝑛 𝜔 𝜔 𝑙 なので Pr 𝑧0 = 1 = 1 𝑛 𝜔 𝑛 𝜔𝑟 ෍ 1≤𝑙≤min 𝜔,𝜔𝑟 𝑙 is 𝑜𝑑𝑑 𝑛 𝑙 𝑛 − 𝑙 𝜔 − 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙
  23. これまでの議論は畳み込みのシフト量によらない つまり𝑧𝑖 に対して𝑇𝑖 でも同様に Pr 𝑧𝑖 = 1 = 1

    𝑛 𝜔 𝑛 𝜔𝑟 ෍ 1≤𝑙≤min 𝜔,𝜔𝑟 𝑙 is 𝑜𝑑𝑑 𝑛 𝑙 𝑛 − 𝑙 𝜔 − 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙 よって ෤ 𝑝 = 1 𝑛 𝜔 𝑛 𝜔𝑟 ෍ 1≤𝑙≤min 𝜔,𝜔𝑟 𝑙 is 𝑜𝑑𝑑 𝑛 𝑙 𝑛 − 𝑙 𝜔 − 𝑙 𝑛 − 𝜔 𝜔𝑟 − 𝑙
  24. これを使うと𝒆′ = 𝒙 ⋅ 𝒓2 𝑖 + 𝒓𝟏 ⋅ 𝒚

    𝑖 + 𝒆𝒊 の分布もわかる 和がxorであることに注意して、頑張って計算すると Pr 𝑒𝑖 ′ = 1 = 2 ෤ 𝑝 1 − ෤ 𝑝 1 − 𝜔𝑒 𝑛 + 1 − ෤ 𝑝 2 + ෤ 𝑝2 𝜔𝑒 𝑛 Pr 𝑒𝑖 ′ = 0 = 1 − ෤ 𝑝 2 + ෤ 𝑝2 1 − 𝜔𝑒 𝑛 + 2 ෤ 𝑝 1 − ෤ 𝑝 𝜔𝑒 𝑛 𝒙 ←𝑋𝑂𝐹 𝑅𝜔 𝒚 ←𝑋𝑂𝐹 𝑅𝜔 𝒓1 ←𝑋𝑂𝐹 𝜃 𝑅𝜔𝑟 𝒓2 ←𝑋𝑂𝐹 𝜃 𝑅𝜔𝑟 ||𝒆|| = 𝜔𝑒
  25. 𝑝∗ = 2 ෤ 𝑝 1 − ෤ 𝑝 1

    − 𝜔𝑒 𝑛 + 1 − ෤ 𝑝 2 + ෤ 𝑝2 𝜔𝑒 𝑛 とおけば Pr ||𝑒′|| = 𝑑 = 𝑛 𝑑 𝑝∗ 𝑑 1 − 𝑝∗ 𝑛−𝑑 あとはHQCの連接符号の最小ハミング距離と比べればいい! ベルヌーイ分布だにょ
  26. HQCのDFR(復号失敗率) HQC-1 < 2−128 HQC-3 < 2−192 HQC-5 < 2−256

    HQCで使う 符号パラメータは固定だよ