公開鍵暗号 ── 公開鍵と秘密鍵のペアによる暗号化
インターネット上で安全に通信できるのは、 公開鍵暗号のおかげ。 ブラウザの鍵マーク、 メールのS/MIME、 ビットコインの署名、 すべて同じ原理です。
「南京錠とその鍵」の比喩が直感的:
Alice が Bob に秘密メッセージを送るなら:
途中で誰が見ても、 南京錠は開けられないので安全。 これが共通鍵暗号(同じ鍵で施錠/解錠)と決定的に違う点。
小さい数字でRSAを体験:$p=11, q=13$ とすると:
実用では $N$ が2048bit(617桁の10進数)。 これを素因数分解するのは現在のスパコンでも数千年級。
最小限のスニペットで動作確認できる例。 公的データ(SSDSE 等)を想定しています。
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' 暗号→復号で復元 |
公開鍵暗号は単独で使うものではなく、 共通鍵・ハッシュ・署名と組み合わせた「プロトコル」として機能する。 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)に準拠することが推奨される。
| 方式 | 基盤の困難性 | 鍵長(標準) | 用途 |
|---|---|---|---|
| RSA | 素因数分解 | 2048-4096bit | 暗号化・署名 |
| ECC | 楕円曲線離散対数 | 256-521bit | 暗号化・署名・鍵交換 |
| DH | 離散対数 | 2048bit以上 | 鍵交換 |
| EdDSA | 楕円曲線 | 256bit | 署名(SSH、 Tor) |
| Kyber(PQC) | 格子問題 | 1568bit | 耐量子鍵交換 |
| Dilithium(PQC) | 格子問題 | 1312bit | 耐量子署名 |
HTTPS通信の裏側では:
つまり公開鍵暗号は「最初の鍵共有」だけに使われ、 本文は共通鍵というハイブリッド方式が標準。
| 方式 | 基盤の困難性 | 鍵長(標準) | 用途 |
|---|---|---|---|
| RSA | 素因数分解 | 2048-4096bit | 暗号化・署名 |
| ECC | 楕円曲線離散対数 | 256-521bit | 暗号化・署名・鍵交換 |
| DH | 離散対数 | 2048bit以上 | 鍵交換 |
| EdDSA | 楕円曲線 | 256bit | 署名(SSH、 Tor) |
| Kyber(PQC) | 格子問題 | 1568bit | 耐量子鍵交換 |
| Dilithium(PQC) | 格子問題 | 1312bit | 耐量子署名 |
HTTPS通信の裏側では:
つまり公開鍵暗号は「最初の鍵共有」だけに使われ、 本文は共通鍵というハイブリッド方式が標準。
行政データを安全に共有する場面を想定。 SSDSE-B-2026 の 都道府県 × 総人口 × 65歳以上人口 を CSV のまま送るのではなく、 RSA で暗号化したファイルを送る、 という業務フローを Python で書いてみる。
| 都道府県 | 総人口(2023年) | 65歳以上人口 | 高齢化率(%) |
|---|---|---|---|
| 北海道 | 5,092,000 | 1,681,000 | 33.0 |
| 東京都 | 14,086,000 | 3,205,000 | 22.8 |
| 大阪府 | 8,762,000 | 2,453,000 | 28.0 |
| 愛知県 | 7,477,000 | 1,985,000 | 26.5 |
| 沖縄県 | 1,470,000 | 348,000 | 23.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 への移行計画を立てる必要がある。