CTFにおけるCrypto入門とまとめの1つです。
- 高機能暗号
- 秘密計算
- 秘匿共通集合計算 PSI : Private Set Intersection
- 紛失通信: Oblivious Transfer
- カードベース暗号
- 準同型暗号
- 秘密分散
- ゼロ知識証明 ZKP: Zero-Knowledge Proof
高機能暗号
- 高機能暗号: 暗号化・復号化以上のことができる暗号方式の総称
- 秘密計算: ある暗号文から別の暗号文が作成可能であり、暗号化された平文に対する演算を暗号文のまま行える
- 準同型暗号
- ゼロ知識証明
- 秘密分散
- グループ証明
- ユースケース: プライバシー観点から、ある権限を所有しているkとおのみを証明できれば十分な時に使える
- IDベース暗号
- 検索可能暗号
- NICTによるESKS(:Encrypted System with Keyword Search)
- 低遅延暗号、ハイスループット暗号: 高速なリアルタイム通信の世界で暗号処理がボトルネックにならないように
- 視覚的・物理的暗号技術: 産総研を中心とした研究グループが開発しているもので、視覚的に物理的に高機能暗号を示すことでアルゴリズムの「分かりやすさ」を知ってもらうための暗号(つまり、実用性を求めたものではない?)
- カードベース暗号
- IETF(:Internet Engineering Task Force)でも高機能暗号の標準化について議論がなされている
- Crypto Forum, Privacy Pass WG, Privacy Preserving Measurement WGなど
- 秘匿検索: 検索クエリは隠したまま、検索結果のみを得る
- 秘密計算: ある暗号文から別の暗号文が作成可能であり、暗号化された平文に対する演算を暗号文のまま行える
- TEE: CPUの標準機能を使用して作成されたセキュア領域で安全に処理する仕組み
- Intel SGXが最も普及している
- https://qliphoth.io/seccamp/
- EAGLYSさんのQiitaに日本語解説が大量にあって助かる
秘密計算
- 秘密計算: Secure Computation、各自の入力データは秘密にしたまま、必要な情報のみを得る技術
- 秘密分散方式、秘密分散+MPCベース
- 準同型暗号方式、完全準同型暗号ベース
- 加法準同型暗号 Enc(m) + Enc(n) = Enc(m + n)
- 乗法準同型暗号 Enc(m) * Enc(n) = Enc(m * n)
- 完全準同型暗号: 加法かつ乗法準同型暗号、かつ、この加法と乗法を任意の回数実行可能
- マルチパーティ復号 / MPC: マルチパーティ計算
- fのMPCプロトコル: n人の参加者(パーティ)P0, P1, ..., Pn-1がそれぞれ秘密情報xiを持ち、その情報の他のパーティに秘匿しながら全員で強調計算を行いf(x0, x1, ..., xn-1)を計算すること
- 秘密計算の暗号学的なモデルのうち、一般的なもの
- MPCにおける安全性
- 攻撃者のシナリオについて
- MPCプロトコルの評価軸
- 通信量:必要なデータ通信量
- ラウンド数:必要な通信の回数。MPCでは「各パーティでのローカルでの計算→パーティ間の通信」の1ステップを何ラウンドか行う
- 計算量:必要なローカルでの計算量
- ブラインド署名 / 部分ブラインド署名
秘匿共通集合計算 PSI : Private Set Intersection
- あるデータの2つの集合に対して、お互いに何を持っているのか秘密にしたまま共通する要素を特定する
- ブラインド署名によって実現するアルゴリズムがある
https://qiita.com/SenK/items/a4b6191e44d2226844ec
紛失通信: Oblivious Transfer
https://qiita.com/SenK/items/f8249193d335e78d3333 https://hackmd.io/@theoldmoon0602/BJ3qRgRz_
- OT: Oblivious Transfer, 紛失通信
- 送信者が送信したデータのうち、受信者がどれを受信したのか、送信者が知ることができない
- Rabin-OT
- ラビン暗号を使い、紛失通信路をシミュレートするもので、1/2の確率で相手にメッセージが届き、残りの1/2の確率でメッセージが一切届かない
- 1-out of-2 OT
- 送信者が2つのメッセージを送信し、受信者はその片方のみを受信できる。送信者は、受信者がどちらのメッセージを受信したか分からないタイプのOT
- これを拡張することでn個のメッセージのうちk個を受信するk-out of-n OTが構成できる
- GC: Garbled Circuit
- 任意の論理関数に対するMPCを実現する手法
- Yao の Garbled Circuit プロトコル https://giapppp.github.io/posts/ygc/
カードベース暗号
- カードベース暗号: トランプカードのような物理的なカード組を使って秘密計算する
- コミットメント: とある1bitの変数xを♣と♡のカードの組で表現したときこの2枚をxのコミットメントと呼ぶ
- ♣♡ -> 0, ♡♣ -> 1
- 形式的に表現する際の操作
- turn i: i番目のカードをひっくり返す
- perm (a1, a2,...): 与えられた巡回行列に従ってカードを入れ替える
- ランダムカット: 1列に並んだカードを巡回的にシャッフルする。perm (1 2 3 ... n)
- shuf {a, b, ..}: 与えられた巡回行列のいずれかをランダムに選択してカードを入れ替える
- コミットメント: とある1bitの変数xを♣と♡のカードの組で表現したときこの2枚をxのコミットメントと呼ぶ
- ファイブカードトリック: ANDの秘密計算
- 秘密にしたい入力a,bのコミットメントを裏にして2組用意して♡で挟んだ
a♡b、つまり??♡??を用意する - 左側のコミットメントを逆にする
- 中央の♡を裏返す
?????になる - ランダムカットする
- 全部のカードを表にしたときに、3枚の♡が巡回的に並んでいれば結果はa and b=1であり、それ以外はa and b=0である
- 秘密にしたい入力a,bのコミットメントを裏にして2組用意して♡で挟んだ
- コミット型プロトコル: カードベース暗号による計算の結果がコミットメントとして得られる
- 金持ち比べプロトコル(大小比較を秘密計算する)
- (カードベース暗号ではないが)Yaoの金持ち比べ
- カードベースの金持ち比べ
- 考察
- カードベース暗号ってどのくらい実用的なんだろう。数式を使わない(計算機がいらず、物理的に計算可能)という点で有意性はありそうだが、bit数に対して必要なカードが多そうで物理的なカードを使った実用性はあまりなさそうで、これをモデルとして計算機でやらせるとうまくいくということがある?
- 参考
- 本「暗号の論理と技術」
- https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2023/06/IMI_shinagawa.pdf
- https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2023/06/179a7fb349ed4351c1f033de6995c232.pdf
- https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2024/07/226920c5e4ba0987993c11b13a0a31f3.pdf
- https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2023/06/IMI_Kyodo_Card_20230531_Nuida_rev.pdf
- https://joint.imi.kyushu-u.ac.jp/wp-content/uploads/2024/07/4049afd2ef890c9760a908de314f7740.pdf
準同型暗号
- https://nindanaoto.github.io/
- スキームの核
- 鍵生成
- 暗号化
- 評価: 暗号文に対する直接計算(暗号文のまま計算)
- 復号
- スキーム
- PHE: 部分準同型暗号。足し算か掛け算のどちらかをサポート
- 乗法準同型暗号: RSA、ElGamal
- 加法準同型暗号: Paillier暗号、岡本・内山暗号
- SHE: サムホワット型準同型暗号。加法ができ、乗法のみ演算回数に制限がある
- 例:Boneh–Goh–Nissim暗号、格子暗号の一部
- Leveled FHE: Leveled完全準同型暗号。鍵生成時に決定される一定数のオペレーションをサポート
- FHE: 完全準同型暗号。無制限の加算と乗算をサポート
- 秘匿マルチパーティ計算(SMPC)を促進
- 例:Gentryによる格子暗号ベースの完全準同型暗号
- PHE: 部分準同型暗号。足し算か掛け算のどちらかをサポート
- TenSEAL: 準同型のまま計算するライブラリ
FHE: Fully Homomorphic Encryption 完全準同型暗号
- FHE: Fully Homomorphic Encryption 完全準同型暗号
- 暗号化されたまま無劣化で(つまり何度も)計算が可能
- FHEは、暗号に基づく暗号と多項式演算の数学的原理に基づく
- 「ノイズ」暗号化されたメッセージに意図的に導入されたランダムな要素
- ノイズにより、セキュリティが保証される
- ノイズは暗号化された値に対して計算が行われるたびに増加(加算よりも乗算の方が顕著)し、ノイズが大きくなりすぎると、平文を破損してしまう
- ブートストラッピング: 暗号文のノイズを大幅に低減することで、FHEにおいて無限に計算できるようにするもの
- 種類: ゲートブートストラップ、ファンクショナルブートストラップ、プログラマブルブートストラップ
FHEスキーム
- 多項式の環を使う方式: RLWE: Ring Learning With Errors。R=Z[x]/(xn+1)を使う。主流
- 現代の実装(SEAL, HElib, PALISADE など)は、ほぼ全てRLWE系を使っています
- R=Z[x]/(xn-1)というのは、xn=-1とすることで、多項式を折り返した多項式の環のこと
- BGV/BFV: 正確な算術演算に適した、高精度な方式
- BFV: 整数用のFHE方式。多項式の次数、平文の法、暗号文の法を暗号化パラメタとして持つ
- 方式
[0 0 ... 0 1 0 ... 0]をエンコードしたものを掛け合わせることで、特定の場所だけを抽出した暗号文が得られるので、これなら1bytesなら256通りになるので全探索で暗号文比較で平文が分かる(多分)- N1CTF - n1fhe https://github.com/hash-hash/My-CTF-Challenges/tree/main/n1ctf%202025/n1fhe
- BFV: 整数用のFHE方式。多項式の次数、平文の法、暗号文の法を暗号化パラメタとして持つ
- CKKS: 近似演算に最適化
- CKKSノイズ(暗号演算に含まれる微小な丸め誤差)
- m0leCon CTF 2026 Teaser - One More Bit
- CKKSノイズの影響を統計的に見ることでサイドチャネル的に平文の情報が漏えいする。
- LWE系が別であるらしい
- 整数ベース, 初期のGentryのFHE。イデアル格子を使う。非常に遅いので使わない。
- TFHE: Boolean circuitや小さなデータ項目に対するルックアップテーブルとして表現可能な関数に対して効率的
- 多項式の環を使う方式: RLWE: Ring Learning With Errors。R=Z[x]/(xn+1)を使う。主流
資料
TFHE
https://qiita.com/dkawabe/items/06195c94c434106f8cc5
- TFHE: Torus上のFHE(完全準同型暗号)
- Torus: 0以上1未満の実数の集合、ただし、整数部分は無視する(1の加法減法は無視する)
- TFHEでは、f: T -> T を任意の一次関数として変換する暗号
秘密分散
https://qiita.com/SenK/items/33ce4cbf2fee23df95ec https://www.jstage.jst.go.jp/article/isciesci/63/2/63_71/_pdf
- SS: Secret Sharing, 秘密分散
- 秘密情報を何らかのグループのメンバーに分散する手法の総称
- シェア: 分散させた秘密情報の断片
- (k,n)閾値法 -> n個の分散情報があり、そのうちk個があれば元の情報が復元できる
- 複製型秘密分散を用いた秘密計算
- 秘密情報を何らかのグループのメンバーに分散する手法の総称
- 安全性
- 情報理論的に安全
- 計算量理論的に安全
- 方式
問題
- CSAW'19 CTF Finals Writeup - Sharing is Caring | Blogs
- RaRCTF 2021 | Shamir's Stingy Sharing.md
- CTFtime.org / zer0pts CTF 2020 / dirty laundry / Writeup
- reality (Crypto 279pts) - MDWiki
- Tamil CTF 2021 crypto writeup - Attack All Around
- Google CTF 2019 Write-Up - HackMD
- BSidesCbr 2021 CTF - Crypto | joseph's blog
- BSidesSF CTF wrap-up » SkullSecurity
- SECCON Beginners CTF 2021 WriteUp - memo46
- zer0pts CTF 2020 writeup - HackMD
(n,n)加法型秘密分散法: 平文mと法qを用意し、m=s0+s1+...+sn-1となるようにsiをランダムに選んで分散保持する。復元時は足せばいい
- (2,3)複製型秘密分散法: (n,n)秘密分散法のシェアを1人に複数個割り当てることで(k,n)しきい値法を構成する手法
- m=s0+s1+s2 mod qとなるようにsiをランダムに選ぶ
- (s0,s1), (s1,s2), (s2,s0) のように3つに分散保持する
- 復号時はこのうち2つが集まれば、和を取ってmが復号可能なので、(2,3)
- (2,3)だけでなく、より一般の(k,n)において構築可能
- 線形秘密分散法: これは特定の方式ではなくジャンルだが、シェアの生成関数が線形性を持つような秘密分散方式
- 線形性を持つということは、aのシェアとbのシェアの和はa+bのシェアになるということ。つまり、これを使って秘密計算ができる
- 後は乗算が定義できると良いが、これは各秘密分散ベースMPCでは独自の方式を付け加えて実現している
SSS: シャミアのしきい値法, Shamir's Secret Sharing
- 多項式補完を用いた秘密分散法
- とても分かりやすい 秘密分散技術とホワイトハッカ飴の解説 | 晴耕雨読
- 「実際には整数上の秘密分散は脆弱性があるので使うべきではありません」
- HackTheBox University CTF 2023 - MSS https://hiumee.com/posts/2023-12-12-htb-university-ctf-mss/
- これ?
f(x) = FLAG + a1x + x2x**2 + ... xnx**nとしてシェア(x,y)の数が足りないのだが、y mod xをそれぞれのシェアでとることでy = FLAG mod xになってしまい、CRTするとFLAGが(定数項が)得られてしまう
- HackTheBox University CTF 2023 - MSS https://hiumee.com/posts/2023-12-12-htb-university-ctf-mss/
- 「実際には整数上の秘密分散は脆弱性があるので使うべきではありません」
- 問題
- とても分かりやすい 秘密分散技術とホワイトハッカ飴の解説 | 晴耕雨読
秘密分散ベースのMPC
- BGW方式: Shamirの秘密分散に基づくMPC
- 正確には線形秘密分散であるShamirの秘密分散に対して乗算を実現する方式
- また、BGW方式を簡略化したGRR方式もあり、現在においてはBGW-typeと呼ばれる方式はGRRを指すことが多い
- あまりちゃんと読めていないが、Bootstrapping(特定の復号回路を準同型演算でシミュレートするkとおで、別の鍵の暗号文に乗り換える)というテクを使うらしい
- 複製型秘密分散に基づく方法
- 3パーティでしか使えないっぽい?
- Beaver Tripleに基づく方法
- multiplication tripleと呼ばれる事前計算されたデータを用いるほうほう
- SPDZフレームワークを用いる方法: 加法型秘密分散に基づくMalicious安全な秘密計算手法で、準同型暗号を用いてmultiplication tripleを事前計算する
- 補助クライアントを用いる方法: クライアントが秘密情報をn台のサーバに秘密分散して入力し、結果のシェアだけを受け取り、クライアント上で結果を復元する?
ゼロ知識証明 ZKP: Zero-Knowledge Proof
- ZKP: Zero-Knowledge Proof ゼロ知識証明
- シグマプロトコル
- Bulletproof
- 離散対数問題の困難性にもとづくゼロ知識証明
- ブラインドRSA署名
- BSSシグネチャー
- ZK証明は
- 証明者と検証者が複数段階のチャレンジを介して通信する対話型
- 証明者が証明を一度計算して検証者に送信する非対話型
- (フィアット・シャミール変換の登場です。これは対話型ZK証明を非対話型証明に変換)
- 資料
- https://github.com/sh1k4ku/ctf-challenge/tree/main/0CTF2024/ZKPQC1
- https://github.com/sh1k4ku/ctf-challenge/tree/main/0CTF2024/ZKPQC2
- https://claroty.com/team82/research/hack-the-emulated-planet-vulnerability-hunting-planet-wgs-804hpt-industrial-switch
- https://blog.trailofbits.com/2021/02/19/serving-up-zero-knowledge-proofs/
- https://www.zkdocs.com/
- https://blog.cryptographyengineering.com/2014/11/27/zero-knowledge-proofs-illustrated-primer/
- GiapさんのZKP記事群 https://giapppp.github.io/tags/zkp/
- https://crypto-notes-erhant.vercel.app/
zk-SNARK, zk-STARK
- STARK: Scalable Transparent ARguments-of-Knowledge, 以下を満たすような証明システム
- Scalable: 証明時間がほぼ線形で、検証時間が対数の多項式時間
- Transparet: トラステッドセットアップが存在しない(シークレットや認証局のようなtrust anchorなどが不要)
- Arguments of Knowledge, Lean Cryptography?: 証明者の能力が確率的多項式時間チューリングマシンで実行可能
- 安全な暗号と衝突体制のあるハッシュ関数の存在という、最小限の暗号的仮定のもと動く
- ここに量子耐性が求められる?
- 安全な暗号と衝突体制のあるハッシュ関数の存在という、最小限の暗号的仮定のもと動く
- STARKが多くのSNARK実装と比べて優れている点として、ハッシュ関数の存在以外には暗号学的な仮定を必要としないという点がある。
- arithmetization 算術化
- 分かりやすい資料
FRIプロトコル
- FRI(Fast Reed-Solomon IOP)プロトコル、低次テスト(多項式が指定された次数以下であることを証明する)のための効率的な暗号学的プロトコル
- naiveな方法(FRIプロトコルではない)
- FRIプロトコル
- 分割統治法: d未満の次数を持つ1つの多項式を、d/2未満の次数を持つ2つの多項式に変換する
- クエリの工夫: 2つの多項式f,gがあり、両方の次数がd未満であることをテストする
- 検証者 -> 証明者: 体からランダムな値αを取って送る
- 証明者: クエリ処理の際に、h(x)=f(x)+αg(x)を結果として返すことにする(ここでMerkle木が出てくるらしい)
- このクエリを使って、h(x)の次数がd未満であると判定できれば、f(x)もg(x)も次数はd未満
- 2つの多項式を足すと結果の次数は2つのうち大きいものになるので直感的には正しそう
- αでかけて足すことで次数が最も高いxnの係数が足してゼロになる可能性があるが、これは体が十分に大きい場合は確率的に無視できるほど小さくできる
- 他にも観点があるが、確率的には小さくできて実用上は問題無さそう
- また、悪意ある証明者の考察もされているが、サンプル数を増やすことで見破れるらしい
- 参考
PLONKプロトコル
- zk-SNARKの1つ https://eprint.iacr.org/2019/953
- 大まかに説明すると、Plonk では多項式をチャレンジとしてエンコードし、その多項式を解く有効な値の状態を送信できます。これは Witness と呼ばれ、Plonk はバックエンドで fiat-shamir、ペアリング、その他の処理を行ってゼロ知識スキームに変換します。
- 問題
- Deadsec 2025 Polymao https://github.com/Warriii/CTF-Writeups/blob/main/deadsec25/crypto_polymao.md
Fiat-Shamir変換 フィアット・シャミール変換
- 対話型ZK証明を非対話型証明に変換
- この変換を利用しているプロトコル: PLOKN, Blueetproofs
- Frozen Heart脆弱性
- part1 https://blog.trailofbits.com/2022/04/13/part-1-coordinated-disclosure-of-vulnerabilities-affecting-girault-bulletproofs-and-plonk/
- part2 https://blog.trailofbits.com/2022/04/14/the-frozen-heart-vulnerability-in-giraults-proof-of-knowledge/
- part3 https://blog.trailofbits.com/2022/04/15/the-frozen-heart-vulnerability-in-bulletproofs/