論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
公開鍵暗号
Public-key Cryptography
セキュリティ

🔖 キーワード索引

暗号RSA楕円曲線TLS非対称鍵署名

💡 30秒で分かる結論

公開鍵暗号 ── 公開鍵と秘密鍵のペアによる暗号化

📍 文脈 ── どこで出会うか

インターネット上で安全に通信できるのは、 公開鍵暗号のおかげ。 ブラウザの鍵マーク、 メールのS/MIME、 ビットコインの署名、 すべて同じ原理です。

🎨 直感で掴む

「南京錠とその鍵」の比喩が直感的:

Alice が Bob に秘密メッセージを送るなら:

  1. Alice は Bob の公開南京錠を入手
  2. メッセージを箱に入れて Bob の南京錠でロック
  3. 送る
  4. Bob は自分の鍵で開ける

途中で誰が見ても、 南京錠は開けられないので安全。 これが共通鍵暗号(同じ鍵で施錠/解錠)と決定的に違う点。

📐 定義/数式

【RSA の鍵生成(簡略)】
1) 大きな素数 $p, q$ を選び $N = pq$
2) $\phi = (p-1)(q-1)$
3) $\gcd(e, \phi)=1$ となる $e$ を選ぶ → 公開鍵 $(e, N)$
4) $d \equiv e^{-1} \pmod{\phi}$ → 秘密鍵 $(d, N)$
【暗号化/復号】
$$ C \equiv M^e \pmod{N}, \quad M \equiv C^d \pmod{N} $$
$M$ = 平文、 $C$ = 暗号文。 $e$ で暗号化、 $d$ で復号

🔬 記号を読み解く

公開鍵(public key)
誰にでも配布可能。 暗号化または署名検証に使う
秘密鍵(private key)
本人だけが持つ。 復号または署名生成に使う
一方向性(trapdoor)
公開鍵から秘密鍵を逆算するのが計算的に困難(素因数分解の困難性等)
鍵長
RSAは2048〜4096bit、 ECCは256〜521bit が現代の標準

🧮 実値で計算してみる

小さい数字でRSAを体験:$p=11, q=13$ とすると:

実用では $N$ が2048bit(617桁の10進数)。 これを素因数分解するのは現在のスパコンでも数千年級。

🐍 Python 実装

最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。

🎯 解説: RSA 公開鍵暗号の核「鍵ペア生成 → 暗号化 → 復号」を cryptography ライブラリで実装。 公開鍵 pub で暗号化、 秘密鍵 priv でしか復号できない非対称性を確認する。 padding には OAEP(Optimal Asymmetric Encryption Padding)を使い、 同じ平文でも毎回異なる暗号文(IND-CCA2 安全)になる。 key_size=2048 は 2030 年までの NIST 推奨。
📥 入力例: msg = b"top secret"(秘匿したいバイナリデータ) → 想定: SSDSE-B-2026 の集計途中ファイルや、 自治体間で個票交換する際の保護 → 公開鍵: 公開してよい(GitHub に置く・メールに添付可) → 秘密鍵: 厳重に保管(パスフレーズ+HSM 推奨) → public_exponent=65537 = 2¹⁶+1 は計算効率と安全性の標準値
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 公開鍵暗号は cryptography ライブラリで実装
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

# 鍵ペア生成
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub  = priv.public_key()

msg = b"top secret"
ct  = pub.encrypt(msg, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()),
                                    algorithm=hashes.SHA256(), label=None))
pt  = priv.decrypt(ct, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()),
                                    algorithm=hashes.SHA256(), label=None))
print(pt)  # b'top secret'  暗号→復号で復元
📤 実行例: b'top secret' → 暗号文 ct の長さ: 256 バイト(key_size=2048bit ÷ 8 = 256B 固定) → 鍵生成: 約 0.3 秒(CPU 依存、 素数判定 Miller-Rabin がボトルネック) → 暗号化・復号: それぞれ約 5ms → 同じ msg を 2 回暗号化すると OAEP の randomness で全く別の ct になる
💬 読み方: RSA の安全性は「大きな合成数の素因数分解が困難」という前提に依存する。 2048bit を解くのに 10²⁰ 年掛かる(古典コンピュータ)。 ただし量子コンピュータ実用化後は Shor アルゴリズムで多項式時間に落ちるため、 NIST は 2024 年から CRYSTALS-Kyber 等の耐量子暗号(PQC)への移行を始めた。 実務ではこのコードのように RSA で「セッション鍵」だけ暗号化し、 本文は AES-GCM で暗号化するハイブリッド方式が標準。

🌍 実応用シナリオ — 公的データ流通における公開鍵暗号

公開鍵暗号は単独で使うものではなく、 共通鍵・ハッシュ・署名と組み合わせた「プロトコル」として機能する。 SSDSE-B-2026 を扱う実務での典型ユースケースを整理する。

シナリオ 使う技術 公開鍵暗号の役割
e-Stat API への HTTPS アクセスTLS 1.3サーバ証明書検証+鍵交換(ECDHE)
SSDSE-B-2026 配布ファイル署名RSA-PSS / Ed25519配布元秘密鍵で署名、 受信者公開鍵で検証
分析結果ファイルの暗号メールS/MIME or PGP受信者公開鍵で AES セッション鍵を暗号化
GitHub Actions の Secrets 復号libsodium (X25519)CI ランナーが GitHub 公開鍵で暗号化した秘密鍵を保管
マイナポータル API 認証公的個人認証 JPKIマイナンバーカード内蔵秘密鍵で署名
分析チーム間 SSH 接続OpenSSH (Ed25519/RSA)ed25519 鍵ペアで passwordless 認証

SSDSE-B-2026 は公開データなので暗号化は不要だが、 加工途中の中間ファイル(個票推定や独自集計)には機密性が必要なケースが出てくる。 また、 改ざん検知(完全性)と配布元の証明(真正性)には署名が不可欠で、 これは事実上公開鍵暗号の応用。 公的統計を扱う組織では NICT/IPA の暗号リスト(CRYPTREC)に準拠することが推奨される。

⚠️ よくある落とし穴

❌ 1. 短い鍵長を使う
RSA 1024bit は近未来に破られうる。 2048以上が標準
❌ 2. 生のRSAで長文を暗号化
実用では「ハイブリッド」:本文は共通鍵で、 共通鍵だけ公開鍵で暗号化
❌ 3. 秘密鍵をGitに上げる
実例多数。 .gitignore 徹底、 Secrets Managerを使う
❌ 4. 量子コンピュータ時代を無視
Shor のアルゴリズムでRSA/ECCは破られる。 耐量子暗号(PQC)への移行が課題
❌ 5. 署名と暗号化を混同
署名=認証、 暗号=秘匿。 役割が違う

📚 関連グループ教材

この用語の全体像を学ぶには、 横断的な教材で文脈を掴むのが効率的です。

🔎 深掘り解説

主要アルゴリズム比較

方式基盤の困難性鍵長(標準)用途
RSA素因数分解2048-4096bit暗号化・署名
ECC楕円曲線離散対数256-521bit暗号化・署名・鍵交換
DH離散対数2048bit以上鍵交換
EdDSA楕円曲線256bit署名(SSH、 Tor)
Kyber(PQC)格子問題1568bit耐量子鍵交換
Dilithium(PQC)格子問題1312bit耐量子署名

TLSでの公開鍵暗号

HTTPS通信の裏側では:

  1. ブラウザがサーバに接続
  2. サーバが証明書(公開鍵を含む)を送信
  3. ブラウザが証明書を認証局(CA)の公開鍵で検証
  4. ブラウザが共通鍵を生成、 サーバの公開鍵で暗号化して送信
  5. 以降は共通鍵(高速)で通信

つまり公開鍵暗号は「最初の鍵共有」だけに使われ、 本文は共通鍵というハイブリッド方式が標準。

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)

🔎 深掘り解説

主要アルゴリズム比較

方式基盤の困難性鍵長(標準)用途
RSA素因数分解2048-4096bit暗号化・署名
ECC楕円曲線離散対数256-521bit暗号化・署名・鍵交換
DH離散対数2048bit以上鍵交換
EdDSA楕円曲線256bit署名(SSH、 Tor)
Kyber(PQC)格子問題1568bit耐量子鍵交換
Dilithium(PQC)格子問題1312bit耐量子署名

TLSでの公開鍵暗号

HTTPS通信の裏側では:

  1. ブラウザがサーバに接続
  2. サーバが証明書(公開鍵を含む)を送信
  3. ブラウザが証明書を認証局(CA)の公開鍵で検証
  4. ブラウザが共通鍵を生成、 サーバの公開鍵で暗号化して送信
  5. 以降は共通鍵(高速)で通信

つまり公開鍵暗号は「最初の鍵共有」だけに使われ、 本文は共通鍵というハイブリッド方式が標準。

✅ 使う前のチェックリスト

📖 さらに学ぶには

本サイト内

外部リソース

困ったときは

  1. データの可視化(散布図、 ヒストグラム、 箱ひげ図)で異常を確認
  2. サンプルサイズ・欠損・外れ値を確認
  3. 仮定が満たされているか診断(正規性検定、 等分散性検定など)
  4. 類似研究での標準的な手法を確認
  5. 結果を複数手法でクロスチェック(頑健性確認)

🧮 SSDSE-B-2026 を題材にした実践例

行政データを安全に共有する場面を想定。 SSDSE-B-2026 の 都道府県 × 総人口 × 65歳以上人口 を CSV のまま送るのではなく、 RSA で暗号化したファイルを送る、 という業務フローを Python で書いてみる。

都道府県総人口(2023年)65歳以上人口高齢化率(%)
北海道5,092,0001,681,00033.0
東京都14,086,0003,205,00022.8
大阪府8,762,0002,453,00028.0
愛知県7,477,0001,985,00026.5
沖縄県1,470,000348,00023.7

これらの数値そのものは公開情報だが、 個別事業所の集計(業務システムの内部値)マイクロデータ(個票) を扱うときは、 同じ流れで暗号化を挟む。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 公開鍵暗号で SSDSE-B-2026 を暗号化送信する例
import pandas as pd
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes, serialization

# 1. 受信者が鍵ペアを作る
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub = priv.public_key()
pub_pem = pub.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo,
)

# 2. 送信者が SSDSE-B から必要列だけ抜き出し
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
df = df[df['年度']==2023][['都道府県','総人口','65歳以上人口']]
payload = df.to_csv(index=False).encode('utf-8')

# 3. 公開鍵で暗号化(実用ではハイブリッド: AES鍵だけRSA暗号)
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = AESGCM.generate_key(bit_length=256)
nonce = os.urandom(12)
ct_body = AESGCM(key).encrypt(nonce, payload, None)
ct_key  = pub.encrypt(key, padding.OAEP(
    mgf=padding.MGF1(hashes.SHA256()),
    algorithm=hashes.SHA256(), label=None))

print('暗号化済み本文', len(ct_body), 'バイト / 鍵', len(ct_key), 'バイト')

🔐 もっと深く ── ハイブリッド方式の理由

RSA 2048bit は一度に暗号化できるのが約 245 バイトに限られる。 SSDSE-B-2026 のような 564 行 × 112 列の CSV(数 MB) は直接暗号化できない。 そこで AES(共通鍵)で本文RSA で AES 鍵だけ を暗号化する ハイブリッド方式 が標準。

方式本文の暗号鍵共有典型用途
RSA 単独遅い・サイズ制限小さな鍵・短文署名
AES 単独高速事前共有が必要ローカルファイル暗号化
ハイブリッド(TLS/PGP)AESで高速RSA/ECCで安全ほぼ全ての実用ケース

耐量子暗号への移行

量子コンピュータの Shor のアルゴリズムは、 多項式時間で素因数分解を解く。 RSA/ECC は将来破られる前提で、 NIST が CRYSTALS-Kyber(鍵交換)と Dilithium(署名)を 2024 年に標準化。 行政データの長期保管では、 今のうちから PQC への移行計画を立てる必要がある。

⚠️ 実装で陥りやすい罠(追加)

❌ 6. パディング無しのRSA
教科書通りの $C=M^e \bmod N$ は同一平文→同一暗号文。 リプレイ攻撃可能。 必ず OAEP パディングを使う。
❌ 7. 鍵のローテーション忘れ
一度漏れた鍵は永久に危険。 定期的に鍵を更新し、 旧鍵で復号できる移行期間を設ける運用が必要。
❌ 8. CA(認証局)の信頼性過信
公開鍵が正しい所有者のものかは CA の証明書チェーンで担保。 中間者攻撃を防ぐには証明書ピンニングが有効。