暗号系ロードマップ:古典暗号・対称鍵・RSA・Diffie-Hellman・楕円曲線・ハッシュ・署名・TLSのPython実装ハブ

暗号 + ロードマップ + Python実装 + 主要API (gmpy2.powmod / sympy.isprime / cryptography.hazmat / hashlib.sha256) を軸に、古典暗号・対称鍵 (AES/ChaCha20)・公開鍵 (RSA/ElGamal)・鍵交換 (Diffie-Hellman/ECDH)・楕円曲線・ハッシュ・デジタル署名・TLS/プロトコルまでを 1 本の学習ハブに集約。繰り返し二乗法と素数判定を共通基盤として、初心者から実装志向まで 4 レベル別に進路を提示する。

なぜ「暗号系」を 1 本のハブに束ねるのか

GA4 で https://yuhi-sa.github.io/posts/20260225_rsa/1/ の PV が直近 7 日間で 16 → 52(+968%)と継続的に爆発浮上している。検索流入を解析すると、「RSA Python 実装」「公開鍵 仕組み」「ECDSA 署名」「Diffie-Hellman 鍵交換」「SHA-256 Python」など、RSA 単体ではなく暗号体系全体に対する需要が見えてきた。これは本ブログにおける暗号トピックが、信号処理・機械学習・最適化とは独立した 第 8 のクラスタとして育ち始めたサインである。

一方で、暗号は「数学的基盤」「アルゴリズム」「プロトコル」「実装ライブラリ」の 4 軸が複雑に絡む領域であり、単発の記事を読み進めるだけでは「結局どこから手を付ければよいか」が見えにくい。本記事は、これら 4 軸を 古典暗号 → 対称鍵 → 公開鍵 → 鍵交換 → 楕円曲線 → ハッシュ → 署名 → プロトコルの 8 段階に整理した集約ハブとして機能する。

本ブログ内の既存記事を起点として、次の 3 本を中核に据える:

  1. https://yuhi-sa.github.io/posts/20260225_rsa/1/ — RSA 公開鍵暗号(鍵生成・暗号化・復号・正当性証明・Miller–Rabin 素数判定)
  2. https://yuhi-sa.github.io/posts/20201220_binary/1/ — 繰り返し二乗法(バイナリ法)による高速べき乗剰余計算
  3. https://yuhi-sa.github.io/posts/20201223_elgamal/1/ — 楕円曲線 ElGamal 暗号(離散対数問題に基づく公開鍵暗号)

これら 3 本に加え、Diffie–Hellman https://yuhi-sa.github.io/posts/20230907_dh/1/(入門)と https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/(Safe Prime・MITM 対策・ECDH・X25519・Triple-DH まで踏み込んだ詳解版)、拡張ユークリッド互除法 https://yuhi-sa.github.io/posts/20201015_euclidean/1/、OAuth 2.0 / OIDC https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/、ゼロトラスト https://yuhi-sa.github.io/posts/20260226_zero_trust/1/、セキュリティ資格 https://yuhi-sa.github.io/posts/20260223_security_certs/1/ を外周に配置することで、理論 → 実装 → プロトコル → 運用 の縦串が通った 1 枚図になる。

既存の信号処理・機械学習側 7 ハブとは独立したクラスタとして整備するが、繰り返し二乗法は離散 DSP 基礎 https://yuhi-sa.github.io/posts/20260613_discrete_dsp_basics/1/ とモンテカルロ最適化 https://yuhi-sa.github.io/posts/20260522_monte_carlo_optimization/1/ の両方とも数値計算の基礎を共有する。橋渡しは §9 で扱う。

1. 学習レベル別ロードマップ

暗号は「数学的厳密性」と「実装ライブラリの使いこなし」の二刀流が必要な領域である。読者の出発点に応じて 4 レベルの進路を示す。

Level 1 — 完全初心者(暗号に初めて触れる)

目標: 「暗号化と復号は鍵で対称/非対称になる」という大枠を掴み、シーザー暗号・XOR 暗号・SHA-256 のハッシュという基本語彙を獲得する。

  1. https://yuhi-sa.github.io/posts/20201220_binary/1/ — まず繰り返し二乗法で大きな数のべき乗剰余に慣れる。RSA・DH・ElGamal すべての計算核
  2. https://yuhi-sa.github.io/posts/20201015_euclidean/1/ — ユークリッド互除法と拡張版でモジュラ逆元を計算できるようになる
  3. https://yuhi-sa.github.io/posts/20260225_rsa/1/ — RSA 鍵生成・暗号化・復号を Python で動かす(教科書 RSA)
  4. https://yuhi-sa.github.io/posts/20260223_security_certs/1/ — 暗号技術が試験範囲に入る情報処理安全確保支援士・CISSP の概要

目安: 2〜4 週間。pow(m, e, n) で RSA 暗号化が 1 行で書けると分かれば Level 1 突破。

Level 2 — 数論基礎を体系化(モジュラ算術・素数判定・離散対数)

目標: フェルマーの小定理・オイラーの定理・拡張ユークリッド・ミラーラビン素数判定・離散対数問題を学習言語として獲得する。

  1. https://yuhi-sa.github.io/posts/20260225_rsa/1/ — オイラーのトーシェント関数 \(\varphi(N) = (p-1)(q-1)\) 、Miller–Rabin
  2. https://yuhi-sa.github.io/posts/20201015_euclidean/1/ — 拡張ユークリッド互除法 → モジュラ逆元
  3. https://yuhi-sa.github.io/posts/20230907_dh/1/ — Diffie–Hellman 鍵交換、離散対数問題(DLP)の困難性
  4. https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/ — Safe Prime / MITM 対策 / ECDH / X25519 / Triple-DH の詳解
  5. https://yuhi-sa.github.io/posts/20201223_elgamal/1/ — 楕円曲線上の離散対数問題(ECDLP)

目安: 4〜6 週間。「なぜ素因数分解が困難なら RSA が安全と言えるのか」「なぜ離散対数が困難なら DH が安全と言えるのか」を 1 文で答えられるようになる。

Level 3 — 公開鍵暗号を本格理解(RSA・ElGamal・楕円曲線)

目標: 公開鍵 3 系統(素因数分解 / 離散対数 / 楕円曲線離散対数)の困難性仮定の違いと、それぞれの鍵長と速度のトレードオフを言語化する。

  1. https://yuhi-sa.github.io/posts/20260225_rsa/1/ — RSA 鍵長 2048〜4096 ビット、\(e = 65537\) の慣習
  2. https://yuhi-sa.github.io/posts/20230907_dh/1/ — DH の鍵長 2048〜3072 ビット、群と生成元の選び方
  3. https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/ — Safe Prime、Curve25519 上の ECDH、X25519、Signal Triple-DH
  4. https://yuhi-sa.github.io/posts/20260702_elliptic_curve_cryptography/1/ — 楕円曲線暗号の数学と Python 実装:点加算・ECDLP・ECDH・ECDSA・X25519
  5. https://yuhi-sa.github.io/posts/20201223_elgamal/1/ — 楕円曲線 ElGamal、256 ビットで RSA 3072 ビット相当の安全性
  6. https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/ — JWT 署名に RS256 / ES256 が使われる現場

目安: 6〜8 週間。cryptography.hazmat.primitives.asymmetric の API ツリーが読めるようになる。

Level 4 — プロトコル/実装志向(TLS・JWT・ゼロトラスト)

目標: 暗号アルゴリズムを部品として、TLS 1.3 / JWT / OAuth 2.0 / OIDC / ゼロトラストといった現代プロトコルを組み立てる側に回る。

  1. https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/ — OAuth 2.0 / OIDC と JWT 署名検証
  2. https://yuhi-sa.github.io/posts/20260226_zero_trust/1/ — ゼロトラスト・mTLS・PKI
  3. https://yuhi-sa.github.io/posts/20260223_security_certs/1/ — CISSP / 情報処理安全確保支援士の出題範囲

目安: 8〜12 週間並行。cryptography.hazmat を読みこなし、自前で署名検証・鍵交換ハンドシェイクを書けるレベル。

2. 古典暗号 → 対称鍵 → 公開鍵 → 鍵交換 → 楕円曲線 → ハッシュ → 署名 → プロトコル(8 段階)

暗号の歴史と学習順序はだいたい一致する。8 段階で一望できる地図を示す。

段階 1: 古典暗号(シーザー・換字・Vigenère)

換字や転置による暗号。鍵空間が小さいので頻度分析で破られる。学習価値は「暗号化=鍵による関数適用」という抽象を掴むこと。

段階 2: 対称鍵暗号(AES・ChaCha20)

送信者と受信者が同じ鍵を共有する方式。AES-128 / 256(ブロック暗号)と ChaCha20(ストリーム暗号)が現代の主流。Python では cryptography.hazmat.primitives.ciphers から利用する。鍵共有問題が残るため、公開鍵暗号や鍵交換と組み合わせる。

段階 3: 公開鍵暗号(RSA・ElGamal)

公開鍵と秘密鍵を別にする方式。RSA は素因数分解の困難性、ElGamal は離散対数の困難性に依拠する。詳細は https://yuhi-sa.github.io/posts/20260225_rsa/1/ と https://yuhi-sa.github.io/posts/20201223_elgamal/1/。鍵生成・暗号化・復号の核に繰り返し二乗法 https://yuhi-sa.github.io/posts/20201220_binary/1/ とモジュラ逆元(拡張ユークリッド) https://yuhi-sa.github.io/posts/20201015_euclidean/1/ がある。

段階 4: 鍵交換(Diffie–Hellman・ECDH)

公開な通信路上で、第三者に盗聴されても共通鍵を導出できるプロトコル。離散対数問題の困難性に依拠する。入門は https://yuhi-sa.github.io/posts/20230907_dh/1/、Safe Prime / MITM 対策 / ECDH / X25519 まで踏み込む実装版は https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/。TLS 1.3 では ECDHE が必須。

段階 5: 楕円曲線暗号(ECC・ECDSA・ECDH)

整数の乗法群の代わりに楕円曲線上の点の加法群を使うことで、はるかに短い鍵長で同等の安全性を実現する。Weierstrass 形式・点加算・ECDLP・P-256 / secp256k1 / Curve25519 の比較から Python 実装(フルスクラッチ + cryptography.hazmat)までは https://yuhi-sa.github.io/posts/20260702_elliptic_curve_cryptography/1/ で詳解している。楕円曲線 ElGamal は https://yuhi-sa.github.io/posts/20201223_elgamal/1/。署名版が ECDSA、鍵交換版が ECDH。

段階 6: ハッシュ関数(SHA-2・SHA-3・BLAKE2)

任意長の入力を固定長に圧縮する一方向関数。衝突困難性・原像困難性・第二原像困難性の 3 性質を満たすことが要件。hashlib.sha256hashlib.blake2b が Python 標準。署名やパスワード保存の前段で必須。

段階 7: デジタル署名(RSA-PSS・ECDSA・EdDSA)

秘密鍵で署名し、公開鍵で検証することで、メッセージの完全性と送信者認証を同時に提供する。実用上はメッセージそのものではなくハッシュに対して署名する(hash-then-sign パラダイム)。Python では cryptography.hazmat.primitives.asymmetric.padding.PSSec.ECDSA を使う。

段階 8: プロトコル(TLS・JWT・OAuth・PKI)

ここまでの部品を組み合わせて安全なセッションを構築する層。TLS 1.3 は ECDHE で鍵交換、AES-GCM で対称暗号、ECDSA / EdDSA で署名、SHA-256 でハッシュという完全装備。詳細は https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/、https://yuhi-sa.github.io/posts/20260226_zero_trust/1/ に進む。

3. 本ブログ内の構成記事マップ

本ハブが束ねる中核記事と、それぞれの位置付けを 1 枚にまとめる。

中核 8 記事(理論 + 実装)

  • https://yuhi-sa.github.io/posts/20201220_binary/1/ — 繰り返し二乗法(バイナリ法)。RSA・DH・ElGamal すべての計算核
  • https://yuhi-sa.github.io/posts/20201015_euclidean/1/ — ユークリッド互除法 / 拡張版。モジュラ逆元 → RSA の秘密鍵 \(d\) 生成
  • https://yuhi-sa.github.io/posts/20260225_rsa/1/ — RSA 鍵生成・暗号化・復号、Miller–Rabin 素数判定、\(e = 65537\)
  • https://yuhi-sa.github.io/posts/20230907_dh/1/ — Diffie–Hellman 鍵交換、群と生成元、DLP の困難性(入門)
  • https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/ — Diffie–Hellman 詳解:Safe Prime / MITM 対策 / ECDH / X25519 / Triple-DH
  • https://yuhi-sa.github.io/posts/20260702_elliptic_curve_cryptography/1/ — 楕円曲線暗号詳解:Weierstrass 形式 / 点加算 / ECDLP / ECDH / ECDSA / X25519
  • https://yuhi-sa.github.io/posts/20201223_elgamal/1/ — 楕円曲線 ElGamal、ECDLP、点の加法
  • https://yuhi-sa.github.io/posts/20260223_security_certs/1/ — 暗号技術が問われるセキュリティ資格の比較

接続先(プロトコル・運用)

  • https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/ — OAuth 2.0 / OpenID Connect、JWT 署名(RS256 / ES256)
  • https://yuhi-sa.github.io/posts/20260226_zero_trust/1/ — ゼロトラスト・mTLS・PKI

将来追加予定の暗号系記事(プレースホルダ)

本ハブは生きた地図として運用する想定で、以下のテーマは今後の優先候補として明示しておく:

  • AES / ChaCha20(対称鍵)
  • SHA-2 / SHA-3 / BLAKE2 と HMAC(ハッシュと MAC)
  • RSA-PSS / ECDSA / EdDSA(署名スキーム)
  • TLS 1.3 ハンドシェイク詳解
  • Post-Quantum Cryptography(CRYSTALS-Kyber / Dilithium)

これらが追加され次第、本ハブにリンクを差し込む形で更新する。

4. 数学的基盤の橋渡し

暗号で繰り返し登場する数学的基盤を 4 つに分けて整理する。

4.1 モジュラ算術(modular arithmetic)

整数を法 \(n\) で割った余りの世界。\(\mathbb{Z}/n\mathbb{Z}\) 。RSA の \(c = m^e \bmod N\) も、DH の \(g^a \bmod p\) も、すべてここで動く。繰り返し二乗法 https://yuhi-sa.github.io/posts/20201220_binary/1/ は \(O(\log e)\) で \(m^e \bmod N\) を計算する手法であり、暗号系の計算量を実用範囲に押し込めている。

\[ m^e \bmod N \quad \text{を素朴に計算すると } O(e) \text{、繰り返し二乗法なら } O(\log e). \tag{1} \]

4.2 素数判定と素数生成

RSA は大きな素数を 2 つ必要とする。決定的判定 (AKS) は遅すぎるので、Miller–Rabin の確率的判定で代用する。\(k = 20\) 回繰り返せば誤判定率は \(4^{-20} \approx 10^{-12}\) 。詳細は https://yuhi-sa.github.io/posts/20260225_rsa/1/。Python では sympy.isprime が標準。

4.3 離散対数問題(DLP)と楕円曲線離散対数問題(ECDLP)

\(g, h \in (\mathbb{Z}/p\mathbb{Z})^*\) について \(h = g^x \bmod p\) を満たす \(x\) を求める問題が DLP。古典的には準指数時間(一般数体ふるい)でしか解けず、これが DH と ElGamal の安全性の根拠。楕円曲線上では一般攻撃が完全指数時間となるため、より短い鍵で同等の安全性を達成できる。

4.4 オイラーの定理と CRT

\(\gcd(a, N) = 1\) のとき

\[ a^{\varphi(N)} \equiv 1 \pmod{N} \tag{2} \]

が成り立つ(オイラーの定理)。RSA の復号正当性 \(c^d = m^{ed} \equiv m \pmod N\) はここから出る。実装では中国剰余定理 (CRT) を使って \(\bmod p\) と \(\bmod q\) で別々に計算し、約 4 倍高速化する手法が広く用いられる。詳しい導出は https://yuhi-sa.github.io/posts/20260225_rsa/1/。

4.5 共通基盤:べき乗剰余の再利用

繰り返し二乗法は暗号だけでなく、素数判定(Miller–Rabin)離散 DSP の DFT 高速化(https://yuhi-sa.github.io/posts/20260613_discrete_dsp_basics/1/ の FFT は \(O(N \log N)\) の二分木構造を共有)、モンテカルロ最適化(https://yuhi-sa.github.io/posts/20260522_monte_carlo_optimization/1/ のサンプリングで \(O(\log N)\) 累積分布の二分探索)でも本質的に同じ「指数を 2 進展開して分割計算する」アイディアが使われる。

5. Python 実装ガイド — ライブラリの使い分け

暗号は車輪の再発明をしない領域である。自前実装は学習用、運用には認証済みライブラリが鉄則。Python の暗号関連ライブラリを使い分け表で整理する。

5.1 ライブラリ比較表

ライブラリ主用途代表 API学習 vs 運用備考
組み込み powべき乗剰余 \(m^e \bmod n\)pow(m, e, n)両用内部で繰り返し二乗法。RSA・DH の核
組み込み math.gcd最大公約数math.gcd(a, b)両用C 実装で高速
hashlib (標準)ハッシュ・HMAChashlib.sha256(b).hexdigest()hashlib.blake2b両用SHA-2 / SHA-3 / BLAKE2 / shake
hmac (標準)メッセージ認証コードhmac.new(key, msg, hashlib.sha256).digest()両用鍵付きハッシュ
secrets (標準)暗号学的乱数secrets.token_bytes(32)secrets.randbelow(n)運用random ではなく必ずこれを使う
sympy素数判定・数論関数sympy.isprime(n)sympy.nextprime(n)sympy.gcdex(a, b)学習教育・プロトタイプ用。RSA 鍵生成練習に最適
gmpy2多倍長高速演算gmpy2.powmod(m, e, n)gmpy2.invert(e, phi)gmpy2.gcdext両用GMP バインディング。pow より数倍高速
cryptography.hazmat低レベル暗号プリミティブpadding.OAEPpadding.PSSec.ECDSACipher運用これを使うのが現代の正解。hazmat は危険物の意
cryptography.fernet簡易対称鍵Fernet(key).encrypt(b).decrypt(c)運用AES-128-CBC + HMAC-SHA256 のラッパ。失敗しにくい
PyCryptodome各種暗号Crypto.PublicKey.RSACrypto.Cipher.AES両用cryptography より歴史が古い。教育系コードで頻出
pyjwtJWT 署名検証jwt.encode(payload, key, algorithm="RS256")運用OAuth / OIDC で必須
pyca/nacl (PyNaCl)NaCl / libsodiumnacl.public.Boxnacl.signing.SigningKey運用Curve25519 / Ed25519。API を間違えにくい設計

5.2 使い分けの実務的指針

  • 学習・プロトタイプ: sympy.isprimepow(m, e, n)、自前の extended_gcdRSA を 1 から書く。https://yuhi-sa.github.io/posts/20260225_rsa/1/ の実装がそのまま使える
  • 大きな数の高速演算: gmpy2.powmodgmpy2.invertgmpy2.is_prime に切り替える。RSA-4096 の鍵生成が数倍速くなる
  • 本番: cryptography.hazmat.primitives.asymmetric.rsaeced25519hashesciphers のみを使う。自前の RSA を本番投入してはならない
  • トークン: pyjwt で JWT、fernet で簡易対称暗号。失敗パターンが少ない
  • 乱数: 鍵・nonce 生成は必ず secrets または os.urandomrandom モジュールは暗号目的では絶対に使わない

5.3 RSA を 4 ライブラリで書き比べ

# 1) 標準ライブラリのみ(教育用)
import secrets, math
def egcd(a, b):
    if a == 0: return b, 0, 1
    g, x1, y1 = egcd(b % a, a)
    return g, y1 - (b // a) * x1, x1
# pow(m, e, n) で暗号化、pow(c, d, n) で復号

# 2) sympy(プロトタイプ)
from sympy import isprime, nextprime, mod_inverse
p = nextprime(secrets.randbits(1024))
q = nextprime(secrets.randbits(1024))
n, phi = p * q, (p - 1) * (q - 1)
e = 65537
d = mod_inverse(e, phi)

# 3) gmpy2(高速)
import gmpy2
c = gmpy2.powmod(m, e, n)
m_dec = gmpy2.powmod(c, d, n)

# 4) cryptography.hazmat(本番)
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
ct = key.public_key().encrypt(
    b"hello",
    padding.OAEP(mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None),
)

理論コードと実装 API の橋渡しは https://yuhi-sa.github.io/posts/20260225_rsa/1/ と https://yuhi-sa.github.io/posts/20201220_binary/1/ を併読すると、なぜ pow(m, e, n) が 1 行で済むのかが腹落ちする。

5.4 ハッシュと署名の最短コード

import hashlib, hmac
digest = hashlib.sha256(b"message").hexdigest()
mac = hmac.new(key=b"k", msg=b"m", digestmod=hashlib.sha256).hexdigest()

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
sk = ec.generate_private_key(ec.SECP256R1())
sig = sk.sign(b"msg", ec.ECDSA(hashes.SHA256()))
sk.public_key().verify(sig, b"msg", ec.ECDSA(hashes.SHA256()))

6. 鍵長と安全性の比較表

安全性レベル (bits)RSA / DHECC対称鍵ハッシュ用途
801024160(なし)SHA-1 (廃止)過去の遺物
11220482243DES (廃止)SHA-2242030 年頃まで
1283072256AES-128SHA-256現在の標準
1927680384AES-192SHA-384高セキュリティ
25615360512AES-256SHA-512政府機密

読み方: 同じ行は「同等の安全性を提供する」鍵長。RSA-3072 ≒ ECC-256 ≒ AES-128 ≒ SHA-256 が現在 (2026 年時点) の主流。ECC の鍵長圧縮効果が一目で分かる。

詳細な議論は https://yuhi-sa.github.io/posts/20260225_rsa/1/(RSA-2048 vs 4096)と https://yuhi-sa.github.io/posts/20201223_elgamal/1/(ECC の優位性)を参照。

7. 学習チェックリスト 12 項目

暗号系の理解度を自己診断する 12 項目。

モジュラ算術とアルゴリズム

  1. \(m^e \bmod n\) を繰り返し二乗法で \(O(\log e)\) で計算する手順を説明できる(https://yuhi-sa.github.io/posts/20201220_binary/1/)
  2. 拡張ユークリッド互除法から \(e \cdot d \equiv 1 \pmod{\varphi(N)}\) の \(d\) を導出できる(https://yuhi-sa.github.io/posts/20201015_euclidean/1/)
  3. Miller–Rabin 素数判定の確率的性質を 1 文で説明できる(https://yuhi-sa.github.io/posts/20260225_rsa/1/)

公開鍵暗号と鍵交換

  1. RSA の安全性が素因数分解の困難性に依拠することを説明できる
  2. Diffie–Hellman の安全性が離散対数問題に依拠することを説明できる(https://yuhi-sa.github.io/posts/20230907_dh/1/)
  3. ElGamal と RSA の数学的基盤の違い(DLP vs 素因数分解)を言える(https://yuhi-sa.github.io/posts/20201223_elgamal/1/)

楕円曲線とハッシュ・署名

  1. ECC が RSA より短い鍵長で済む理由(ECDLP の困難性)を 1 文で言える
  2. ハッシュ関数の 3 性質(衝突困難性・原像困難性・第二原像困難性)を列挙できる
  3. hash-then-sign パラダイム(メッセージではなくハッシュに署名)の理由を説明できる

プロトコルと運用

  1. TLS 1.3 ハンドシェイクで使われる暗号要素(ECDHE / AES-GCM / ECDSA / SHA-256)を 1 行で説明できる
  2. JWT の alg ヘッダで RS256 / ES256 / HS256 の使い分けが言える(https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/)
  3. 「自前で AES や RSA を実装してはならない」理由(サイドチャネル攻撃・パディング攻撃)を説明できる(https://yuhi-sa.github.io/posts/20260226_zero_trust/1/)

8. よくある詰まりポイント Q&A

Q1. なぜ RSA は遅いのか?

RSA は鍵長 2048〜4096 ビットの多倍長整数でべき乗剰余を計算するため、対称鍵 (AES) の数百〜数千倍遅い。実用では、RSA で AES 用の対称鍵だけを暗号化し、本文は AES で暗号化するハイブリッド方式を取る。TLS もこの構造。pow(m, e, n) の中身は繰り返し二乗法 https://yuhi-sa.github.io/posts/20201220_binary/1/。

Q2. 離散対数の困難性とは具体的に何か?

「\(g, h, p\) が与えられたとき \(h \equiv g^x \pmod p\) を満たす \(x\) を求める」問題が DLP。\(g^x\) の計算は繰り返し二乗法で \(O(\log x)\) と高速だが、逆問題は一般数体ふるいでも準指数時間 \(\exp(O((\log p)^{1/3} (\log \log p)^{2/3}))\) かかる。これが DH の安全性の根拠。詳細は https://yuhi-sa.github.io/posts/20230907_dh/1/ と https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/。

Q3. 楕円曲線が省鍵長で済む理由は?

整数の乗法群 \((\mathbb{Z}/p\mathbb{Z})^*\) では準指数時間アルゴリズム(一般数体ふるい)が存在するが、汎用的な楕円曲線上ではそうしたアルゴリズムがまだ発見されていない。Pollard rho 等の汎用攻撃は完全指数時間 \(O(\sqrt{n})\) なので、\(n\) を小さくしても安全性を保てる。\(n = 256\) ビットの楕円曲線が RSA-3072 と同等。詳細は https://yuhi-sa.github.io/posts/20201223_elgamal/1/。

Q4. 教科書 RSA をそのまま使うとなぜ危険なのか?

パディングなしの \(c = m^e \bmod n\) は決定的(同じ平文 → 同じ暗号文)であり、選択平文攻撃 / 選択暗号文攻撃 に脆弱。具体的には Bleichenbacher 攻撃などがある。実用では OAEP(暗号化)と PSS(署名)のランダムパディングを必ず併用する。実装は cryptography.hazmat.primitives.asymmetric.padding.OAEP。詳細は https://yuhi-sa.github.io/posts/20260225_rsa/1/ の「セキュリティ注意」。

Q5. なぜ random ではなく secrets / os.urandom を使うのか?

randomメルセンヌ・ツイスタによる疑似乱数生成器で、過去出力からシード状態が復元可能。鍵や nonce に使うと致命的。secrets モジュールは OS のエントロピー源 (/dev/urandom) を直接使うため、暗号学的に安全。鍵生成・トークン発行は secrets.token_bytes(32) が定石。

Q6. ハッシュと暗号化の違いは?

ハッシュは一方向関数(逆算不可能)。暗号化は鍵で可逆(秘密鍵があれば復号できる)。ハッシュは「同じか」の判定や署名前段に使い、暗号化は「読まれないように」したいときに使う。ハッシュにパスワードを保存する場合は SHA-256 ではなく bcrypt / scrypt / Argon2 を使う(計算コストを上げて総当たり攻撃を防ぐ)。

Q7. ポスト量子暗号 (PQC) はいつ移行すればよいか?

NIST が 2024 年に標準化した CRYSTALS-Kyber(鍵交換)と Dilithium(署名)が現在の主流。Shor のアルゴリズムが実用化される前にハーベスト・ナウ・デクリプト・レイター(今盗み貯めて将来復号する)攻撃を考えると、長期秘匿が必要な通信は早期に PQC へ移行すべき。具体的な移行戦略は https://yuhi-sa.github.io/posts/20260226_zero_trust/1/ の文脈で扱う予定。

9. 関連ハブへの橋渡し

本ハブは暗号系の独立クラスタとして機能するが、繰り返し二乗法乱数 / モンテカルロ的な確率手法を介して、信号処理・最適化・機械学習のハブと数学的な橋を持つ。

A. 離散 DSP 基礎ハブ — 繰り返し二乗法の数値計算共通基盤

https://yuhi-sa.github.io/posts/20260613_discrete_dsp_basics/1/ の FFT は \(O(N \log N)\) の分割統治構造を持ち、これは繰り返し二乗法 https://yuhi-sa.github.io/posts/20201220_binary/1/ の「指数を 2 進展開して分割計算」の発想と数学的に同根。「二分木構造で計算量を \(O(N)\) から \(O(\log N)\) に落とす」 という共通アイディアが両者を貫いている。

B. モンテカルロ最適化ハブ — 乱数の暗号学的安全性との対比

https://yuhi-sa.github.io/posts/20260522_monte_carlo_optimization/1/ のサンプリングは統計的乱数(np.random)で十分だが、暗号鍵生成では secrets / os.urandom が必須。乱数の「品質」の意味が文脈で異なることを意識すると、両領域の API 設計が立体的に見える。MCMC(https://yuhi-sa.github.io/posts/20260226_mcmc/1/)の擬似乱数列と、暗号 PRNG の違いは Q&A Q5 で触れた通り。

C. DSP/ML メタロードマップ — 全体俯瞰の入口

https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/ は信号処理・機械学習の 7 ハブを束ねるメタロードマップ。暗号は別系統だが、「学習ロードマップは段階を設計する」 というメタ原則は共有している。本ハブもメタロードマップで参照されるべき 8 番目のハブとして機能する。

D. その他のハブとの距離感

ハブ数学的接続学習順序の関係
https://yuhi-sa.github.io/posts/20260521_bode_plot/1/弱(連続系制御)別系統
https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/弱(信号処理)別系統
https://yuhi-sa.github.io/posts/20260524_time_frequency_guide/1/別系統
https://yuhi-sa.github.io/posts/20260525_ml_timeseries_guide/1/中(特徴量設計)別系統だが ML 共通
https://yuhi-sa.github.io/posts/20260613_discrete_dsp_basics/1/(FFT vs 繰返し二乗法)共通基盤
https://yuhi-sa.github.io/posts/20260522_monte_carlo_optimization/1/中(乱数の質)補完関係
https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/メタ上位ハブ

E. 関連記事まとめ

本ハブが束ねる中核記事

  • https://yuhi-sa.github.io/posts/20201220_binary/1/ — 繰り返し二乗法
  • https://yuhi-sa.github.io/posts/20201015_euclidean/1/ — ユークリッド互除法 / 拡張版
  • https://yuhi-sa.github.io/posts/20260225_rsa/1/ — RSA 公開鍵暗号
  • https://yuhi-sa.github.io/posts/20230907_dh/1/ — Diffie–Hellman 鍵交換(入門)
  • https://yuhi-sa.github.io/posts/20260614_diffie_hellman/1/ — Diffie–Hellman 詳解
  • https://yuhi-sa.github.io/posts/20201223_elgamal/1/ — 楕円曲線 ElGamal
  • https://yuhi-sa.github.io/posts/20260226_oauth2_oidc/1/ — OAuth 2.0 / OIDC
  • https://yuhi-sa.github.io/posts/20260226_zero_trust/1/ — ゼロトラスト
  • https://yuhi-sa.github.io/posts/20260223_security_certs/1/ — セキュリティ資格比較

接続先ハブ

  • https://yuhi-sa.github.io/posts/20260521_bode_plot/1/ — Bode 線図ハブ
  • https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/ — フィルタ設計指針ハブ
  • https://yuhi-sa.github.io/posts/20260522_monte_carlo_optimization/1/ — モンテカルロ最適化ハブ
  • https://yuhi-sa.github.io/posts/20260524_time_frequency_guide/1/ — 時間周波数解析ハブ
  • https://yuhi-sa.github.io/posts/20260525_ml_timeseries_guide/1/ — 機械学習時系列ハブ
  • https://yuhi-sa.github.io/posts/20260613_discrete_dsp_basics/1/ — 離散 DSP 基礎ハブ
  • https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/ — DSP/ML メタロードマップ

関連ツール(DevToolBox)

暗号は数学・アルゴリズム・実装ライブラリ・プロトコルが層を成す領域である。本ハブを起点として、自分の興味とゴールに合うレベルから読み進めてほしい。