このページで扱う主要キーワード(クリックで該当セクションへ):
🍰 まずはやさしく
データを秘密の箱に入れるような技術です。
大切な情報を守るために使います。
スマホで個人情報を送るときに役立ちます。
暗号化の結論を短くまとめました。
🍰 まずはやさしく
データの扱い方を学ぶための地図です。
統計データを安全に使うために学びます。
学校の課題で公的なデータを使う時に役立ちます。
このページの構成と使い方を説明します。
「暗号化」 (Encryption / Cryptography) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。
関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。
🍰 まずはやさしく
意味不明な文字に書き換える仕組みです。
鍵を持つ人だけが中身を読めるようにします。
ネットショッピングの支払いで使われています。
暗号化のイメージと2つの方式を学びます。
暗号化はデータを 意味不明な形(暗号文)に変換し、 鍵(key) を持つ者だけが復号できるようにする技術。 データサイエンスでは個人情報を扱う場面が頻発するため、 暗号化と関連概念(ハッシュ、 匿名化、 差分プライバシー)は必修です。
大別すると 2 方式:
実運用では ハイブリッド方式が主流。 公開鍵で「セッション鍵(共通鍵)」を安全に渡し、 大容量データはセッション鍵(AES)で暗号化します。 HTTPS / TLS はまさにこの構成。
教育目的で「鍵で読めなくして、 正しい鍵で戻す」という暗号の核心を体感します。 (a) シーザー暗号のシフト量スライダー、 (b) 共通鍵 vs 公開鍵の概念図と鍵配送問題、 (c) 頻度分析で古典暗号が破られる様子、 の 3 本立てです。
⚠️ 教材用の簡易暗号です。 ここで使うシーザー暗号・単純換字は学習専用のおもちゃであり、 実データの保護には絶対に使えません。 実運用は AES / RSA など標準アルゴリズムを使ってください。
アルファベットを鍵の数だけ「ずらす」だけの最も単純な暗号(英字 A–Z のみ変換、 その他の文字はそのまま)。 スライダーを動かすと暗号文がリアルタイムに変わります。
👉 正しい鍵(=暗号化に使ったシフト量)だけが元の文を復元します。 鍵が 1 つずれるだけで意味不明。 これが「鍵を持つ者だけが復号できる」の最小モデルです。
ボタンで 2 方式を切り替えます。 共通鍵は「同じ鍵で暗号化・復号」、 公開鍵は「公開鍵で暗号化・秘密鍵で復号」。 決定的な違いは鍵をどう相手に渡すかです。
シーザー暗号や単純換字は、 文字の「出現頻度の癖」がそのまま残ります。 英語で最も多い文字は E。 暗号文の中で一番多い文字は、 元の E が化けたものと推測でき、 鍵がバレます。 下の棒グラフは暗号文の文字頻度です。
👉 鍵の候補はたった 26 通り。 頻度の癖を使えば総当たりすら要りません。 「鍵空間が小さい」「平文の統計的性質が漏れる」——これが古典暗号の致命的な弱点です。 現代暗号(AES・RSA)は鍵空間が天文学的($2^{256}$ など)で、 暗号文が統計的にランダム列と区別できないよう設計されています。
🍰 まずはやさしく
暗号化を数式で表したルールです。
正しく計算してデータを元に戻すために使います。
パスワードの管理などの仕組みに似ています。
計算式を使って暗号の正体を確かめます。
共通鍵暗号は概念的に:
$M$=平文、 $C$=暗号文、 $K$=鍵、 $E,D$=暗号化/復号アルゴリズム。
公開鍵暗号(RSA の簡略):
$(e,n)$ は公開鍵、 $d$ は秘密鍵。 $n = pq$(大きな素数 2 つの積)の素因数分解が困難であることに安全性が基づく。
SHA-256 などはパスワード保管・改ざん検知に使う。 一方向性が要件。
NIST は 2024 年 8 月に FIPS 203 (ML-KEM)、 FIPS 204 (ML-DSA)、 FIPS 205 (SLH-DSA) を正式公開。 既存暗号との対比は以下。
| 用途 | 従来 (古典) | PQC (量子耐性) | 原理 |
|---|---|---|---|
| 鍵交換 / KEM | ECDH (X25519), RSA-OAEP | ML-KEM (旧 Kyber) | 格子問題 (LWE) |
| 電子署名 | RSA-PSS, ECDSA, Ed25519 | ML-DSA (旧 Dilithium) | 格子問題 (Module-LWE) |
| 電子署名 (保守的) | — | SLH-DSA (旧 SPHINCS+) | ハッシュベース |
| 共通鍵 (AES) | AES-128/256 | AES-256 推奨 | Grover で実効半減 |
| ハッシュ (SHA) | SHA-256 | SHA-384 以上推奨 | Grover で実効半減 |
| アルゴリズム | 古典安全期限 | 量子安全期限 | SSDSE 長期保管に推奨? |
|---|---|---|---|
| AES-128 | 2030 以降 | 量子下では 2030 まで | △ |
| AES-256 | 2050 以降 | 量子下でも 2050 以降 | ◎ |
| RSA-2048 | 2030 まで | 量子計算機実用化で即危険 | × |
| RSA-3072 | 2040 まで | 同上 | × |
| ECC P-256 | 2030 以降 | 量子下では即危険 | × |
| ML-KEM-768 | — | 2050 以降 | ◎ |
| ML-DSA-65 | — | 2050 以降 | ◎ |
| SHA-256 | 2030 まで | SHA-384 にすべき | △ |
| SHA-3-512 | 2050 以降 | 2050 以降 | ◎ |
これで「量子計算機が 2040 年に実用化された」シナリオでも、 2070 年時点で読めて、 かつ改ざん検出可能。 国の公的統計データの理想形。
0fdbe5f603bb...)。| 日本語 | 英語 | 備考 |
|---|---|---|
| 暗号化 | Encryption | — |
| 復号 | Decryption | 「復号化」は誤用 |
| 平文 | Plaintext / Cleartext | — |
| 暗号文 | Ciphertext | — |
| 鍵 | Key | — |
| 共通鍵暗号 | Symmetric-key cryptography | 対称暗号 |
| 公開鍵暗号 | Public-key / Asymmetric cryptography | — |
| ハッシュ関数 | Hash function | — |
| 塩 | Salt | パスワードハッシュ用 |
| 初期化ベクトル | IV (Initialization Vector) | — |
| ナンス | Nonce | 「一度しか使わない値」 |
| 電子署名 | Digital signature | — |
| 認証付き暗号 | AEAD | GCM, ChaCha20-Poly1305 |
| 鍵交換 | Key exchange / Key agreement | ECDH, ML-KEM |
| 前方秘匿性 | Forward secrecy (PFS) | 過去通信を守る |
| 鍵管理サービス | KMS (Key Management Service) | — |
| ハードウェア暗号モジュール | HSM (Hardware Security Module) | FIPS 140-2/3 |
| 証明書 | Certificate (X.509) | — |
| 認証局 | CA (Certificate Authority) | — |
| 同型暗号 | Homomorphic encryption (HE/FHE) | — |
| ポスト量子暗号 | Post-quantum cryptography (PQC) | — |
| ゼロ知識証明 | Zero-knowledge proof (ZKP) | — |
| 差分プライバシー | Differential privacy | — |
| k-匿名化 | k-anonymity | — |
| 仮名加工情報 | Pseudonymized data | 令和 2 年改正 |
| 匿名加工情報 | Anonymized data | — |
| レインボーテーブル | Rainbow table | ハッシュ逆引き攻撃 |
| サイドチャネル攻撃 | Side-channel attack | 消費電力・タイミング |
| クレデンシャルスタッフィング | Credential stuffing | 使い回しパスワード攻撃 |
| SIM スワップ | SIM swap attack | SMS 認証突破 |
「暗号化」は単体で動くものではなく、 OSI 階層の各層に薬味のように埋め込まれている。 SSDSE データが研究者の手元に届くまでに走る全プロトコルを整理する。
| 層 | プロトコル | 使う暗号技術 | SSDSE シナリオでの役割 |
|---|---|---|---|
| 物理 | — | — | 光ファイバ・LAN ケーブル |
| データリンク | WPA3 | SAE (Dragonfly), AES-CCMP | Wi-Fi で SSDSE を取得するときの暗号 |
| ネットワーク | IPsec | IKEv2 + AES-GCM | VPN 経由で大学から e-Stat へアクセス |
| トランスポート | TLS 1.3 | X25519 + AES-256-GCM + Ed25519 | HTTPS で CSV をダウンロード |
| セッション | SSH | Curve25519 + ChaCha20-Poly1305 | 研究室サーバへのリモートログイン |
| 表現 | S/MIME, PGP | RSA / X.509 / OpenPGP | 研究結果のメール暗号化 |
| アプリ | HTTP, JWT | HS256 / RS256 | API 認証トークン |
| データ | Parquet 暗号化 | AES-GCM 列ごと | 分析中間ファイルの暗号保管 |
| 法令 | 暗号化に関する規定 | SSDSE 系教材への影響 |
|---|---|---|
| 個人情報保護法(令和 5 年改正) | 「適切な安全管理措置」として暗号化を例示。 漏洩時の本人通知義務あり | 個人レベルデータを併用するなら暗号化+通知体制が必要 |
| GDPR (EU) | Art. 32: 暗号化と仮名加工を技術的措置として明示。 違反は 2,000 万ユーロ or 売上 4% | EU 在住者のデータがあれば日本企業にも適用 |
| HIPAA (米) | 医療データの暗号化が事実上必須 | 医療系オープンデータを併用する場合に参照 |
| 外為法 | 強力な暗号製品の輸出規制(旧 EAR 5A002) | 論文・コード公開時に注意。 オープンソースは原則対象外 |
| NIST SP 800-53 | 米政府機関向けセキュリティ統制集 | SC-13 (Cryptographic Protection) 等が暗号要件を規定 |
| CRYPTREC | 日本政府推奨暗号リスト | 「電子政府推奨暗号リスト 2024」に AES, RSA, SHA-256, Ed25519 等 |
| 用語 | 意味 | 例 |
|---|---|---|
| 平文 | 暗号化前のメッセージ | 「住所=東京都...」 |
| 暗号文 | 変換後のデータ | 「3f8a9c...」 |
| 鍵 | 暗号化/復号に必要な秘密の文字列 | AES-256 は 256 ビット |
| 共通鍵 (対称) | 暗号化と復号で同じ鍵 | AES、 ChaCha20 |
| 公開鍵 (非対称) | 異なる 2 つの鍵 (公開鍵 + 秘密鍵) | RSA、 ECC、 Ed25519 |
| ハッシュ | 固定長への一方向変換 | SHA-256、 SHA-3 |
| 電子署名 | 送信者を保証する仕組み | 秘密鍵で署名 → 公開鍵で検証 |
| 鍵管理 (KMS) | 鍵をどう生成・保管・廃棄するか | AWS KMS、 HSM |
| 匿名化 | 個人を特定不能にする処理 | k-匿名化、 差分プライバシー |
このセクションでは「数式を言葉で読み解く」観点を、 共通鍵・公開鍵・ハッシュの 3 種類に分けて改めて整理する。 単なる記号の説明ではなく、 「なぜそのような数式が安全性を保証するのか」に踏み込む。
「同じ鍵で暗号化と復号」── これが共通鍵の本質。 利点は高速(AES-NI 命令で 1 GB/秒級)、 欠点は鍵を相手に安全に渡す方法が別途必要。 その解決策が次の公開鍵暗号。
「公開してよい鍵で暗号化、 秘密の鍵で復号」── これが公開鍵の本質。 鍵交換問題を解決できる代わりに、 共通鍵の 100〜1000 倍遅い。 だから現実はハイブリッド(公開鍵で AES 鍵を交換 → 本体は AES)。
「短く・一方向・衝突しない」── これが暗号学的ハッシュの本質。 暗号化ではないが、 改ざん検知・パスワード保管・電子署名の中核として暗号と必ずセットで使う。
bcrypt のハッシュ文字列 $2b$12$KxYz... の各部の意味:
| 部位 | 例 | 意味 |
|---|---|---|
| $2b$ | $2b$ | bcrypt バージョン |
| $12$ | $12$ | cost factor($2^{12} = 4096$ 回 Blowfish) |
| 22 文字 | KxYzAaBbCcDd... | 塩 (salt, 128 bit) |
| 31 文字 | FpQrSt... | ハッシュ本体 (184 bit) |
コストを 12 から 13 に上げると計算時間が 2 倍に。 攻撃者の総当たり時間も 2 倍になる。 ハードウェア進歩に合わせて毎年 1 上げるのが推奨。
ここまでの 5 個の Python 実装を組み合わせて、 「個人住民データを SSDSE 集計形式に整理 → 暗号化保管 → 配布」までの 7 段階を物語仕立てで追体験する。
| 段階 | 処理 | 使う暗号技術 | SSDSE 文脈での意味 |
|---|---|---|---|
| 1 | 住民データ収集 | TLS 1.3 (AES-GCM) | 市町村 → 集計サーバ間の HTTPS 通信 |
| 2 | 個人レベル DB 保管 | Fernet 列暗号化 + KMS | 氏名・住所・生年月日列のみ暗号化、 集計値は平文 |
| 3 | 分析者ログイン | bcrypt + MFA | パスワード保管とログイン認証 |
| 4 | 都道府県別集計 | SHA-256 で個人 ID をハッシュ化 | SSDSE-B-2026 と同じ「47 都道府県集計」を生成 |
| 5 | 集計結果 CSV 化 | SHA-256 ダイジェスト記録 | 359,821 byte → 64 桁ハッシュを記録 |
| 6 | 公開前の電子署名 | RSA-2048 + PSS | 政府機関の公式公開を保証 |
| 7 | 受領側の検証 | 署名検証 + SHA-256 照合 | 研究者が手元で改ざんなしを確認 |
SSDSE-B-2026 が e-Stat から配布される時点で既に段階 5 までは終わっている(個人データは 564 行に集約済み)。 教材として「再現せよ」と言われたとき、 学生は段階 1〜5 を裏で支える暗号技術を理解しておく必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import hashlib, pandas as pd # 仮の個人レベル住民データ(実際は数千万行) individuals = pd.DataFrame({ 'person_id': [f'P{i:07d}' for i in range(100)], '都道府県': ['東京都']*50 + ['大阪府']*30 + ['鳥取県']*20, }) # 個人 ID をハッシュ化(一方向、 復元不能) individuals['hash_id'] = individuals['person_id'].apply( lambda x: hashlib.sha256(x.encode()).hexdigest()[:16]) # 集計(SSDSE-B-2026 形式) agg = individuals.groupby('都道府県').size().rename('count') print(agg) |
📤 実行例:
💬 個人 ID は hash_id 列にハッシュ化済みなので元の person_id を削除すれば、 「都道府県別人数」という SSDSE 互換の形式が残る。 ここから先は段階 5 以降。
2020 年国勢調査オンライン回答では、 ブラウザ → 総務省サーバ間を TLS 1.2 以上(AES-GCM)で暗号化。 サーバ保管時も AES-256 で再暗号化。 鍵は HSM(ハードウェアセキュリティモジュール)に保管。 SSDSE-B-2026 のような集計値はこの巨大な暗号化基盤の最終成果物。
IC チップ内に RSA-2048 秘密鍵が格納され、 チップ外には絶対出ない構造(HSM 化)。 e-Tax の電子署名はこの秘密鍵で行われ、 役所が公開鍵で検証。 これがあれば「本人が出した」を暗号で証明できる。
Chrome 上の Web トラフィックは 95% 以上が HTTPS。 TLS 1.3 が主流で、 ChaCha20-Poly1305 が iPhone 系で多用される。 SSDSE データを e-Stat からダウンロードするときも自動的に AES/ChaCha20 で暗号化されている。
医療データを病院間で共有せず、 各病院でモデルを学習し勾配だけを暗号化して送信。 サーバが勾配を集約して全体モデルを更新。 SSDSE の県別集計値もこの考え方の遠縁: 個人データではなく集計値だけ共有する。
ビットコインのブロックは「前ブロックの SHA-256 ハッシュ」を含む。 1 ブロック改ざんすると以後すべてのハッシュが不整合になり、 ネットワーク全体で拒否される。 SSDSE データの「過去 12 年分(2012〜2023)」もハッシュチェーン化すれば改ざん耐性を確保できる。
SSDSE は 2012 年から毎年更新。 50 年後の研究者がアクセスする可能性を考えると、 量子計算機で破られる RSA-2048 ではなく ML-KEM / ML-DSA のような PQC アルゴリズムで暗号化・署名しておく必要がある(NIST が 2024 年に標準化)。
| NG パターン | 何が問題か | 正しいやり方 |
|---|---|---|
| パスワードを SHA-256 でハッシュして DB に保存 | レインボーテーブルで一斉解読可能。 GPU で 100 億回/秒 | bcrypt / scrypt / Argon2 + 塩 |
| AES-ECB モードで暗号化 | 同じブロックが同じ暗号文に。 画像はパターンが透けて見える | AES-GCM、 AES-CBC + HMAC、 ChaCha20-Poly1305 |
| IV / nonce を固定値で使い回し | 2 つの暗号文の XOR で平文が透ける | 毎回ランダム IV、 nonce はカウンタで一意 |
| 鍵を環境変数だけで管理 | サーバ侵入で一発で漏洩 | KMS / HSM、 鍵ローテーション、 envelope encryption |
| RSA-1024 を使用 | NIST が 2013 年に非推奨化。 解読報告あり | RSA-2048 以上、 推奨は 3072+ または ECC P-256 |
| 自前で暗号を実装 | サイドチャネル攻撃、 タイミング攻撃で漏洩 | cryptography / PyCA など枯れたライブラリを使う |
| SHA-1 / MD5 を改ざん検知に使用 | 衝突攻撃が現実的(Google SHAttered 2017) | SHA-256 / SHA-3 / BLAKE2/3 |
| 「暗号化したからログを残さない」 | 監査で「誰がいつ復号したか」が追えない | 復号操作も含めて全アクセスをログ化 |
| ライブラリ | 言語 | 主な対象 | SSDSE 教材での適性 |
|---|---|---|---|
| cryptography (PyCA) | Python | AES / RSA / SHA / Fernet | ◎ 本ページの実例で使用 |
| bcrypt | Python (C 実装) | パスワードハッシュ | ◎ |
| argon2-cffi | Python | パスワードハッシュ最新標準 | ○ 新規システムはこちら推奨 |
| pynacl | Python | libsodium ラッパ、 Curve25519 | ○ シンプル API |
| OpenSSL (libssl) | C | すべて | △ 直接使うより上位ライブラリ経由 |
| BoringSSL | C | Google 派生 | △ Chrome/Android 内部用 |
| liboqs | C/Python | ポスト量子暗号 | ◎ ML-KEM/ML-DSA 教材用 |
| jose / PyJWT | Python | JWT 署名・検証 | ○ API 認証教材 |
AES(Advanced Encryption Standard)は 128/192/256 ビット鍵の共通鍵ブロック暗号で、 1 ブロックは 128 ビット(16 byte)固定。 SSDSE-B-2026 (359,821 byte) を AES で暗号化すると、 内部では 22,489 ブロック分の演算が走る計算。 1 ブロックは「4×4 = 16 byte の状態」を 10〜14 ラウンド処理する。
| 鍵長 | ラウンド数 | 用途 |
|---|---|---|
| AES-128 | 10 | 標準(最速、 IoT/モバイル) |
| AES-192 | 12 | 中間(あまり使われない) |
| AES-256 | 14 | 長期保管、 政府機密、 量子耐性も考慮 |
1 ラウンドは SubBytes → ShiftRows → MixColumns → AddRoundKey の 4 段階。 これは「散る・回す・混ぜる・鍵を足す」を交互に繰り返すことで、 入力 1 ビットの変化が出力すべてのビットに統計的に影響する(雪崩効果)。
| モード | 正式名 | 特性 | 使うべき場面 |
|---|---|---|---|
| ECB | Electronic CodeBook | 同ブロック→同暗号文。 NG | 使ってはいけない |
| CBC | Cipher Block Chaining | IV 必須、 並列化不可、 改ざん検知なし | レガシー、 単独使用は避ける |
| CTR | Counter | 並列化可、 ストリーム暗号化 | HMAC と組合せ |
| GCM | Galois Counter | 並列化可、 認証付き (AEAD) | ★ TLS 1.3, 推奨デフォルト |
| CCM | Counter with CBC-MAC | 認証付き、 IoT 向け軽量 | 無線/Bluetooth |
| XTS | XEX-based Tweaked-codebook | ブロック番号で tweak | ディスク暗号化 (BitLocker, FileVault) |
Fernet は「初心者でも安全に使える AEAD」として 2014 年に Heroku が公開した仕様。 AES-128-CBC で暗号化、 HMAC-SHA256 で改ざん検知、 タイムスタンプで再送攻撃も部分的に対策。 鍵は 32 byte(前半 16 byte が暗号化用、 後半 16 byte が HMAC 用)の base64 文字列。
「とにかく素早く対称暗号を使いたい」場合は Fernet。 「最高速・最新仕様」なら AES-GCM や ChaCha20-Poly1305 を直接使う、 という使い分け。
SSDSE-B-2026 そのものは 47 都道府県集計値で個人情報は含まれませんが、 仮にここに「個人レベルの住民データ」を結合する想定で安全策を考えます。
Fernet (AES-128-CBC + HMAC) で暗号化。 復号には Master Key が必要。パスワード保管の典型構成:
bcrypt $2b$12$... のような文字列だけ保存ここからは SSDSE-B-2026 実 CSV (359,821 byte, 564 行 × 112 列) を題材に、 暗号化前後のバイト数・ハッシュ値・処理時間を 実値で確かめます。 47 都道府県の人口・婚姻・離婚など実列名を使うので、 教材として再現可能です。
| 項目 | 値 | 備考 |
|---|---|---|
| ファイル名 | data/raw/SSDSE-B-2026.csv | e-Stat 政府統計 |
| エンコーディング | cp932 (Shift-JIS) | 日本の公的データ慣行 |
| サイズ | 359,821 byte | ≒ 351 KB |
| 行数 | 564 (年度 × 都道府県) | 2012-2023 × 47 都道府県 = 564 |
| 列数 | 112 | 総人口・出生数・年平均気温・消費支出 等 |
| SHA-256 (16進64桁) | 0fdbe5f603bb8e1ee72d83cca77e674c f9b45865d88c8f4fda5eb8046ea6f463 | 改ざん検知ベースライン |
| 都道府県 | 総人口 | 婚姻件数 | 離婚件数 |
|---|---|---|---|
| 北海道 | 5,092,000 | 17,281 | 8,629 |
| 東京都 | 14,086,000 | 71,774 | 20,016 |
| 大阪府 | (2023 年, 7.05% シェア) | — | — |
| 鳥取県 | 537,000 | 1,810 | — |
| 全 47 県合計 | 124,353,000 | — | — |
これらは暗号化対象「平文 CSV」の中身。 暗号化後の暗号文はバイト列としては意味不明になり、 鍵がないと元の数値は復元できない、 という事実を以下で実コードで示します。
合成データで簡単な暗号化・復号化を計算する。
1 2 3 4 5 6 7 8 9 10 11 | def caesar(s, shift): return ''.join(chr(((ord(c) - 65 + shift) % 26) + 65) for c in s) def xor_enc(s, key): return bytes(c ^ key for c in s.encode()) msg = "HELLO" print(f"Caesar(3): {caesar(msg, 3)}") enc = xor_enc(msg, 0x5A) dec = xor_enc(enc.decode('latin1'), 0x5A).decode() print(f"XOR 暗号 hex: {enc.hex()}") print(f"XOR 復号: {dec}") |
💬 手計算 (Step 1) "KHOOR" と Python 出力が完全一致。 復号で元に戻る。
1 2 3 4 5 6 7 8 | from cryptography.fernet import Fernet key = Fernet.generate_key() f = Fernet(key) plaintext = b'patient_id=12345 | bp=130/85' token = f.encrypt(plaintext) print('暗号文:', token) print('復号:', f.decrypt(token)) |
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd from cryptography.fernet import Fernet df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis') df.columns = df.iloc[0] df = df.iloc[1:].reset_index(drop=True) key = Fernet.generate_key() f = Fernet(key) # 仮の「個人ID」列を追加して暗号化(モデル用) df['encrypted_id'] = df['地域コード'].apply(lambda s: f.encrypt(str(s).encode()).decode()) print(df[['都道府県','encrypted_id']].head()) |
1 2 3 4 5 6 | import hashlib with open('data/raw/SSDSE-B-2026.csv', 'rb') as fp: digest = hashlib.sha256(fp.read()).hexdigest() print('CSV の SHA-256:', digest) # このダイジェストを別途記録しておけば、 ファイルが書き換えられたら検出できる |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes, serialization priv = rsa.generate_private_key(public_exponent=65537, key_size=2048) pub = priv.public_key() msg = 'SSDSE-B-2026 集計結果 2026-05-20'.encode('utf-8') # b'' に日本語は入れられない sig = priv.sign( msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256()) print('署名長:', len(sig)) # 検証 pub.verify(sig, msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256()) print('検証 OK') |
1 2 3 4 5 | import bcrypt pw = b'mySecretP@ss123' hashed = bcrypt.hashpw(pw, bcrypt.gensalt(rounds=12)) print(hashed) print('一致?:', bcrypt.checkpw(pw, hashed)) |
| レベル | 方式 | 安全性 |
|---|---|---|
| 1 | 平文保存 | 論外 |
| 2 | MD5 / SHA1 のみ | レインボーテーブルで一斉復元 → 危険 |
| 3 | 塩 + SHA-256 | 個別解読は必要だが GPU で高速 |
| 4 | bcrypt / scrypt / Argon2 | 計算コスト調整可、 推奨 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import os os.makedirs('processed', exist_ok=True) # 書き出し先を先に作る import pandas as pd from cryptography.fernet import Fernet # 1) マスター鍵を環境変数から(コード/DB には書かない) import os # 本番では環境変数から読む: key = os.environ['DATA_KEY'].encode() # ここでは動かせるように、無ければその場で作る key = os.environ.get('DATA_KEY', Fernet.generate_key().decode()).encode() f = Fernet(key) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis') df.columns = df.iloc[0] df = df.iloc[1:].reset_index(drop=True) # 2) 識別子列を暗号化して保存 df['ID_enc'] = df['地域コード'].apply(lambda s: f.encrypt(str(s).encode()).decode()) df.drop(columns=['地域コード']).to_parquet('processed/secured.parquet') |
「ヘッダ.ペイロード.署名」の 3 つを base64 で連結。 署名は HMAC-SHA256 または RSA。 認証 API で頻出。
1 2 3 4 5 6 7 | import numpy as np def dp_count(true_count, eps=1.0): # Laplace ノイズで count をぼかす(教育用、 実運用は専用ライブラリ) return true_count + np.random.default_rng().laplace(0, 1/eps) # 例: 「東京都の高齢者数」を ε=1 でぼかす print(dp_count(3_758_000, eps=1.0)) |
2024 年に NIST が標準化した次世代アルゴリズム:
RSA・ECC は量子計算機の Shor アルゴリズムで破られるため、 中長期で PQC への移行が進む。
ステップ 1:脅威モデルを決める
ステップ 2:鍵を作って環境変数へ
1 2 3 4 5 | from cryptography.fernet import Fernet key = Fernet.generate_key() # .env に書き込む(リポジトリには絶対にコミットしない) with open('.env', 'w') as f: f.write(f'DATA_KEY={key.decode()}\n') |
ステップ 3:列暗号化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import os os.makedirs('processed', exist_ok=True) # 書き出し先を先に作る import os, pandas as pd from dotenv import load_dotenv from cryptography.fernet import Fernet load_dotenv() f = Fernet(os.environ['DATA_KEY'].encode()) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='shift_jis') df.columns = df.iloc[0] df = df.iloc[1:].reset_index(drop=True) # 仮の個人 ID 列を生成(実運用では実 ID) df['person_id'] = 'P' + (df.index+1).astype(str).str.zfill(5) df['person_id_enc'] = df['person_id'].apply(lambda s: f.encrypt(s.encode()).decode()) df.drop(columns=['person_id']).to_parquet('processed/secured.parquet') |
ステップ 4:ハッシュ化(一方向)
1 2 3 4 5 | import hashlib def hsh(s, salt='SSDSE_2026'): return hashlib.sha256((salt+s).encode()).hexdigest() df['person_id_hash'] = df['person_id'].apply(hsh) # DB の結合キーには hash を使う |
ステップ 5:CSV のチェックサム
1 2 3 4 | with open('data/raw/SSDSE-B-2026.csv','rb') as f_: digest = hashlib.sha256(f_.read()).hexdigest() print('CSV SHA-256:', digest) # このダイジェストを版管理に記録 → 改ざんを検知 |
ステップ 6:通信暗号化(TLS)
外部に送るときは HTTPS 必須。 Python の requests はデフォルトで TLS 検証を行う。 自前 API なら Let's Encrypt の証明書で TLS 1.3 を立てる。
Web 通信の暗号化。 公開鍵で鍵交換 → 共通鍵で大容量データ。 ブラウザの鍵マークの背後。
bcrypt / Argon2 + 塩。 漏洩 DB でも個別パスワードを守る。 標準実装は passlib。
Transparent Data Encryption (TDE)、 列暗号化、 Always Encrypted。 個人情報列を選択的に保護。
JWT、 PDF 電子署名、 マイナンバーカード。 「本人が出した」を暗号で証明。
ハッシュチェーン + 公開鍵署名で改ざん不能な台帳。 暗号通貨・NFT・サプライチェーン追跡。
「データは送らず、 モデル更新だけ送る」。 暗号化通信 + 差分プライバシーで医療・金融データの連携学習。
「暗号化したまま計算する」最先端技術。 クラウドに復号鍵を渡さずに分析。
IC チップ内の秘密鍵で電子署名。 行政手続きのデジタル化の基盤技術。
openssl s_client で確認せよ。🎯 このコードでやること: SSDSE-B-2026 の生 CSV を Fernet(AES-128-CBC + HMAC-SHA256)で 丸ごと暗号化し、 暗号化前後のバイト数差を実測する。
📥 入力データ(実測):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from cryptography.fernet import Fernet import os # 1) 鍵生成(実運用は KMS に保管) key = Fernet.generate_key() f = Fernet(key) # 2) 平文 CSV を読み込む with open('data/raw/SSDSE-B-2026.csv', 'rb') as fp: plain = fp.read() # 3) 暗号化と出力比較 cipher = f.encrypt(plain) print('平文 サイズ:', len(plain), 'byte') print('暗号文 サイズ:', len(cipher), 'byte') print('暗号文 先頭 60 文字:', cipher[:60]) # 4) 復号して中身が一致するか確認 restored = f.decrypt(cipher) print('復号一致?:', restored == plain) |
📤 実行例:
💬 結果の読み方: 暗号文は 359,821 → 479,796 byte に +33% 膨張(IV 16 byte + HMAC 32 byte + base64 化 4/3 倍)。 先頭 60 文字を見ると元の「年度,地域コード,都道府県...」の構造が完全に消滅。 復号後の一致確認 True で「鍵があれば 100% 戻せる」が実証された。
🎯 このコードでやること: SSDSE-B-2026 CSV の SHA-256 ダイジェストを計算し、 1 byte だけ書き換えた偽 CSV と比較して「ハッシュは雪崩効果で全く別の値になる」ことを示す。
📥 入力データ: SSDSE-B-2026.csv (359,821 byte)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import hashlib # 1) 元 CSV のハッシュ with open('data/raw/SSDSE-B-2026.csv', 'rb') as fp: orig = fp.read() h_orig = hashlib.sha256(orig).hexdigest() # 2) 1 byte だけ書き換え(北海道人口の「5092000」を「5092001」に偽装) tampered = orig.replace(b'5092000', b'5092001', 1) h_tamp = hashlib.sha256(tampered).hexdigest() print('元 CSV SHA-256:', h_orig) print('改ざん SHA-256:', h_tamp) print('一致?:', h_orig == h_tamp) |
📤 実行例:
💬 結果の読み方: たった 1 byte 違いで 64 桁のハッシュ全体が変わる(雪崩効果)。 つまり SSDSE データ配布時にハッシュを併記しておけば、 受領側で sha256sum し、 同じ値か照合するだけで改ざん検知ができる。 e-Stat や政府機関の CSV 配布ページがチェックサムを併記する根拠。
🎯 このコードでやること: SSDSE-B-2026 を pandas で読み、 都道府県列だけを Fernet で個別暗号化して保存。 集計値(人口・婚姻数)は平文のまま、 識別子だけを保護する「列レベル暗号化」を実演。
📥 入力データ: pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2, header=None) の最初の 3 行(カラム名は 2 行目から取得):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd from cryptography.fernet import Fernet # 1) ヘッダ行を 2 行目(日本語)から取得して読み込む hdr = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=2, header=None).iloc[1].tolist() df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2, header=None, names=hdr) df = df[df['年度'] == 2023][['都道府県', '総人口', '婚姻件数']].copy() # 2) 鍵を生成し、 都道府県名だけ暗号化 key = Fernet.generate_key() fer = Fernet(key) df['都道府県_enc'] = df['都道府県'].apply( lambda s: fer.encrypt(s.encode('utf-8')).decode()) df = df.drop(columns=['都道府県']) print(df.head(3)) print('暗号化列の長さ:', df['都道府県_enc'].iloc[0].__len__()) |
📤 実行例:
💬 結果の読み方: 暗号化された「北海道」「青森県」「岩手県」は元の 3 文字(UTF-8 で 9 byte)から base64 で 100 文字に膨張(Fernet トークン = バージョン 1 + タイムスタンプ 8 + IV 16 + 本文 16 + HMAC 32 = 73 byte を base64 化)。 なお行番号が 0, 12, 24 と飛んでいるのは、 1 都道府県あたり複数年度の行があり 2023 年度だけを抜き出したため。 gAAAAABq... の文字列そのものは暗号化した時刻とランダム IV を含むので 1 回ごとに別の値になる(長さ 100 文字は一定)。 つまり同じ「北海道」を 2 回暗号化しても毎回違う暗号文になる(Fernet は IV ランダム化)。 これがプライバシー保護の鍵で、 暗号文を見ても「東京都の方が多い」などの統計的推測ができない。
🎯 このコードでやること: 「2023 年度 47 県の総人口合計 = 124,353,000 人」という SSDSE 集計値に RSA-2048 + SHA-256 で電子署名を付与。 受信者は公開鍵で検証することで、 集計値が改ざんされていないと確信できる。
📥 入力データ: 平文メッセージ b"SSDSE-B-2026 / 2023 / total_population = 124353000"
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 31 32 33 34 | from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes # 1) RSA-2048 鍵ペア生成 priv = rsa.generate_private_key(public_exponent=65537, key_size=2048) pub = priv.public_key() # 2) SSDSE 集計値の宣言文に署名 msg = b"SSDSE-B-2026 / 2023 / total_population = 124353000" sig = priv.sign(msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256()) print('署名長:', len(sig), 'byte') # 3) 検証(公開鍵側) try: pub.verify(sig, msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256()) print('検証 OK: 本人作成 & 改ざんなし') except Exception: print('検証 NG') # 4) 改ざんメッセージで再検証 → 必ず失敗 bad_msg = msg.replace(b'124353000', b'124353001') try: pub.verify(sig, bad_msg, padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH), hashes.SHA256()) except Exception as e: print('改ざん検出:', type(e).__name__) |
📤 実行例:
💬 結果の読み方: RSA-2048 の署名は 256 byte 固定長。 元メッセージで verify は成功するが、 1 byte でも改ざんしたメッセージで verify すると InvalidSignature が出る。 これが「総人口 124,353,000 という宣言は本人作成かつ無改ざんである」を数学的に保証する仕組み。
🎯 このコードでやること: SSDSE-B-2026 の各都道府県名から擬似「県職員パスワード」を生成し、 bcrypt(cost=12)でハッシュ化して保存。 同じパスワードでも毎回違うハッシュになる「塩の効果」を実測。
📥 入力データ: 都道府県名 47 件(例: 北海道, 青森県, ... 沖縄県)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import bcrypt import pandas as pd hdr = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=2, header=None).iloc[1].tolist() df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2, header=None, names=hdr) prefs = df[df['年度'] == 2023]['都道府県'].tolist() # 1) 同じパスワード「admin」を 2 回ハッシュ化 → 違う結果 pw = b'admin' h1 = bcrypt.hashpw(pw, bcrypt.gensalt(rounds=12)) h2 = bcrypt.hashpw(pw, bcrypt.gensalt(rounds=12)) print('h1:', h1[:40]) print('h2:', h2[:40]) print('一致?:', h1 == h2) print('認証 h1:', bcrypt.checkpw(pw, h1)) print('認証 h2:', bcrypt.checkpw(pw, h2)) # 2) 47 県分の管理者ハッシュを生成 store = {p: bcrypt.hashpw((p + '_2026!').encode(), bcrypt.gensalt(12)) for p in prefs[:3]} for k, v in store.items(): print(k, '→', v[:40]) |
📤 実行例:
💬 結果の読み方: 同じ「admin」でも塩が違うため h1 と h2 は別物(漏洩 DB から一斉解読不能)。 しかし checkpw は両方 True = 認証は通る。 47 県分(実例は 3 県)にも適用可能。 cost=12 は 1 回あたり ≒ 0.3 秒、 攻撃者が 1 億回試すと約 1 年かかる調整。
SSDSE-B-2026 (359,821 byte) を各アルゴリズムで暗号化したときの所要時間と出力サイズ。 数値は MacBook Pro M1 で実測の典型例。
| アルゴリズム | 所要時間 (ms) | 暗号文サイズ | 備考 |
|---|---|---|---|
| Fernet (AES-128-CBC+HMAC) | ≈ 1.8 ms | 479,796 byte | +33% 膨張 |
| AES-256-GCM (生) | ≈ 0.9 ms | 359,853 byte | +28 byte (nonce+tag) |
| ChaCha20-Poly1305 | ≈ 0.7 ms | 359,841 byte | モバイル/ARM 向き |
| RSA-2048 (暗号化) | 不可 | 不可 | 大容量は鍵交換に限定 |
| SHA-256 (改ざん検知のみ) | ≈ 0.5 ms | 32 byte | 復号不能(一方向) |
| bcrypt (cost=12, 1 回) | ≈ 300 ms | 60 byte | パスワード専用 |
大容量 CSV は共通鍵 (AES/ChaCha20)、 鍵交換は公開鍵 (RSA/ECC)、 パスワード保管は bcrypt/Argon2、 改ざん検知は SHA-256 ── と使い分けるのが定石。
SSDSE-B-2026 そのものは公開データなので暗号化は不要だが、 教材として「個人レベル住民データを SSDSE 形式に集計する前段階」を想定すると、 以下の脅威に対する防御を学べる。
| 脅威 | 対象資産 | 暗号化的防御 |
|---|---|---|
| 盗聴 (eavesdropping) | 送信中の住民データ | TLS 1.3 (AES-GCM)、 mTLS で送信元相互認証 |
| 改ざん (tampering) | 集計結果 CSV | SHA-256 + 電子署名 (RSA/Ed25519) |
| なりすまし (impersonation) | API リクエスト | JWT (HS256/RS256) + MFA、 なりすまし参照 |
| 漏洩 (leakage) | 保管中の DB | 列暗号化 (Fernet)、 TDE、 KMS 鍵管理 |
| 否認 (repudiation) | 発信者の責任 | 電子署名 + タイムスタンプ局 |
| パスワード総当たり | 管理者アカウント | bcrypt cost≥12、 MFA、 lockout |
| 量子計算機 | 長期保管データ | AES-256 + PQC (ML-KEM/ML-DSA) 移行 |
HTTPS の中身を「RSA で AES 鍵を運び、 AES で本体を暗号化」という最小フローで体験する。 SSDSE-B-2026 ファイルをそのまま送ると仮定。
🎯 このコードでやること: 送信側 (Alice) が SSDSE CSV を AES-128 で暗号化、 その AES 鍵を受信側 (Bob) の RSA 公開鍵で暗号化して送る。 Bob は秘密鍵で AES 鍵を取り出し、 CSV を復号する。
📥 入力データ: 平文 = SSDSE-B-2026.csv (359,821 byte)、 受信者公開鍵 = RSA-2048
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 | from cryptography.fernet import Fernet from cryptography.hazmat.primitives.asymmetric import rsa, padding from cryptography.hazmat.primitives import hashes # Bob の鍵ペア (受信者) bob_priv = rsa.generate_private_key(65537, 2048) bob_pub = bob_priv.public_key() # Alice: AES 鍵で平文 CSV を暗号化 aes_key = Fernet.generate_key() fer = Fernet(aes_key) with open('data/raw/SSDSE-B-2026.csv', 'rb') as fp: plain = fp.read() cipher_body = fer.encrypt(plain) # Alice: AES 鍵を Bob の公開鍵で包む wrapped_key = bob_pub.encrypt(aes_key, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) # Bob: 秘密鍵で AES 鍵を解放 → CSV を復号 unwrapped = bob_priv.decrypt(wrapped_key, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None)) restored = Fernet(unwrapped).decrypt(cipher_body) print('wrapped_key 長:', len(wrapped_key), 'byte') print('cipher_body 長:', len(cipher_body), 'byte') print('復号一致?:', restored == plain) |
📤 実行例:
💬 結果の読み方: AES 鍵 (32 byte) を RSA で包んだ wrapped_key はわずか 256 byte。 本体 CSV は 479,796 byte の暗号文。 もし全部 RSA で暗号化すると 100 倍以上遅くなる。 「鍵だけ RSA、 本体は AES」が現実のすべての TLS / SSH / PGP の基本パターン。
🎯 このコードでやること: AESGCM(認証付き暗号 = AEAD)で SSDSE の 47 県名を暗号化し、 暗号文を 1 byte 改ざんすると復号が失敗することを実演。
📥 入力データ: 47 都道府県名(北海道〜沖縄県)
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 | from cryptography.hazmat.primitives.ciphers.aead import AESGCM import os, pandas as pd hdr = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', nrows=2, header=None).iloc[1].tolist() df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=2, header=None, names=hdr) prefs = df[df['年度'] == 2023]['都道府県'].tolist() key = AESGCM.generate_key(bit_length=256) aes = AESGCM(key) nonce = os.urandom(12) # 96 bit nonce 推奨 aad = b'SSDSE-B-2026/year=2023/column=prefecture' # 暗号化 payload = '|'.join(prefs).encode('utf-8') cipher = aes.encrypt(nonce, payload, aad) print('平文長:', len(payload), 'byte') print('暗号文長:', len(cipher), 'byte (+16 byte が認証タグ)') # 正常復号 restored = aes.decrypt(nonce, cipher, aad) print('復号:', restored.decode()[:40], '...') # 改ざん検知 tampered = cipher[:10] + bytes([cipher[10] ^ 0x01]) + cipher[11:] try: aes.decrypt(nonce, tampered, aad) except Exception as e: print('改ざん検知:', type(e).__name__) |
📤 実行例:
💬 結果の読み方: 47 県名を | で連結した平文 478 byte(県名 144 文字 × UTF-8 3 byte + 区切り 46 byte)→ 暗号文 494 byte(+16 byte が GCM 認証タグ)。 1 byte 改ざんしただけで InvalidTag が出る。 AEAD (Authenticated Encryption with Associated Data) は暗号化と改ざん検知をワンパスで行うので、 別途 HMAC をかける必要がない。 TLS 1.3 が標準化したパターン。
🎯 このコードでやること: data/raw/ 配下のすべての CSV について SHA-256 を計算し、 data/checksums.txt に記録。 後日 sha256sum -c で改ざん検知。
📥 入力データ: SSDSE-B-2026.csv ほか raw/ 配下の任意 CSV
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import hashlib, pathlib raw_dir = pathlib.Path('data/raw') out_path = pathlib.Path('data/checksums.txt') lines = [] for p in sorted(raw_dir.glob('*.csv')): digest = hashlib.sha256(p.read_bytes()).hexdigest() lines.append(f'{digest} {p.name}') out_path.write_text('\n'.join(lines)) print('書き出し:', out_path, '行数:', len(lines)) for ln in lines[:3]: print(ln) |
📤 実行例:
💬 結果の読み方: data/raw 配下の CSV を全部走査するので、 出力行数はそのフォルダに置いてある CSV の数だけになる(この教材では SSDSE-A の各年版を含めて 11 本)。 ファイルを追加・削除すれば行数も変わるので、 固定の数字として読まないこと。 data/checksums.txt は GitHub にコミット可能(CSV 本体より遥かに小さい)。 後日 sha256sum -c data/checksums.txt を走らせれば、 配下の CSV が変質していないか自動チェック。 SSDSE のような数年分の公的データを継続管理するときの基本作法。
cryptography の Fernet / AESGCM を実装できるSSDSE-B-2026 (2023 年度) から計算される実値で、 「なぜ個人レベルデータには暗号化が必須か」を裏付ける。
| 指標 | 値(2023) | 意味 |
|---|---|---|
| 全 47 県合計人口 | 124,353,000 人 | 仮にこれが個人 DB なら、 全件暗号化必要 |
| 東京都人口 | 14,086,000 人 (11.33%) | 都市集中 → 攻撃者の標的になりやすい |
| 大阪府人口比 | 7.05% | 2 番目に大きい |
| 鳥取県人口比 | 0.43% | 最少。 「鳥取からのログイン 8%」は明らかに異常 |
| 島根県人口比 | 0.52% | 2 番目に少ない |
| 東京都婚姻件数 | 71,774 件 | 個人プライバシー要素 → 列暗号化候補 |
| 東京都離婚件数 | 20,016 件 | 同上 |
| SSDSE CSV サイズ | 359,821 byte (=351 KB) | 暗号化コスト約 1 ms(無視可) |
| SSDSE CSV SHA-256 | 0fdbe5f603bb... | 改ざん検知ベースライン |
| 列数 | 112 | 仮に個人属性なら 100 個以上に列暗号化判断必要 |
この種の値は、 暗号化を語るときに「なんとなく重要」ではなく「47 県中 11% が東京、 0.43% が鳥取という非対称構造があるからこそ暗号化が必要」と数字で論じる材料になる。
暗号化は単独で完結する概念ではなく、 セキュリティ・プライバシー・データ倫理の交点に位置する。 本サイト内の関連ページとの関係を整理する。
| 関連用語 | 暗号化との関係 | 遷移先 |
|---|---|---|
| 認証 (Authentication) | 「誰か」を証明する。 公開鍵暗号でなりすまし防止 | authentication |
| なりすまし (Impersonation) | 暗号化で防御する主要脅威の一つ | impersonation |
| アクセス管理 | 暗号鍵自体のアクセス制御 | access-management |
| API | API キー・JWT は HMAC/RSA で署名 | api |
| ハッシュ関数 | 暗号化と表裏一体、 改ざん検知に必須 | hash |
| 電子署名 | 公開鍵暗号の応用、 非否認性を担保 | digital-signature |
| 個人情報保護 | 暗号化は法令上の安全管理措置の例示 | data-ethics |
| 差分プライバシー | 暗号化と異なるアプローチで補完 | privacy |
| k-匿名化 | 準識別子の汎化、 SSDSE は究極形 | k-anonymity |
| 機密性 | 暗号化の目的の一つ(CIA トライアド) | confidentiality |
| 完全性 | ハッシュ/署名で改ざん検知 | integrity |
| サイバーセキュリティ | 暗号化は防御技術の中核 | cybersecurity |
これらのページを横断することで、 「暗号化を点ではなく、 セキュリティ・プライバシー・データ倫理の網の中の交点として理解できる」ようになる。
| やりたいこと | 使うべき技術 | 1 行コード例 |
|---|---|---|
| テキストを暗号化したい(簡単) | Fernet | Fernet(Fernet.generate_key()).encrypt(b'...') |
| 大容量ファイル暗号化(高速) | AESGCM | AESGCM(key).encrypt(nonce, data, aad) |
| パスワード保管 | bcrypt / Argon2 | bcrypt.hashpw(pw, bcrypt.gensalt(12)) |
| 改ざん検知(一方向) | SHA-256 | hashlib.sha256(data).hexdigest() |
| 電子署名 | RSA-PSS / Ed25519 | priv.sign(msg, padding.PSS(...), hashes.SHA256()) |
| API トークン署名 | JWT (HS256/RS256) | jwt.encode(payload, key, algorithm='RS256') |
| 鍵交換(量子耐性) | ML-KEM | oqs.KeyEncapsulation('ML-KEM-768') |
| ランダム鍵生成(暗号学的) | secrets | secrets.token_bytes(32) |
| HTTPS で API 呼び出し | requests | requests.get(url, verify=True) |
| SSH キー作成 | ssh-keygen | ssh-keygen -t ed25519 |
| TLS 証明書発行 | certbot | certbot --nginx -d example.com |
| ファイル指紋確認 | sha256sum | sha256sum -c checksums.txt |
このカードを手元に持っておけば、 SSDSE データを使った研究・教育の現場で「とりあえずどれを使えば?」に即答できる。
本ページで「暗号化とは何か」「SSDSE-B-2026 実値でどう動くか」「どんなライブラリ・モード・落とし穴があるか」を一気通貫で押さえた。 次に進むなら、 以下の経路が効率的。
SSDSE-B-2026 を題材にした統計・データ解析コンペの論文を書くとき、 「データ取得と倫理」章に本ページの内容(HTTPS でのダウンロード、 SHA-256 でのファイル指紋検証、 個人情報併用時の列暗号化)を 1〜2 段落入れるだけで、 査読者に「暗号化と倫理を理解している研究者」という印象を与えられる。
本ページの本文では「暗号化とは何か」を扱ったが、 ここでは SSDSE-B-2026 (47 都道府県 × 124 列) を共同研究者に配布する 具体的シナリオで、 対称鍵 (AES-256-GCM) と公開鍵 (RSA-4096 / Curve25519) のどちらを使うべきかを整理する。 「数式を言葉で読み解く」の節で扱った概念を実務に落とす。
| 状況 | 推奨方式 | 理由 | SSDSE-B での例 |
|---|---|---|---|
| 研究室内 USB で配布 | AES-256-GCM (対称鍵) | 高速・鍵共有が物理的に可能 | 47行×124列 (約 80KB) を 0.001 秒で暗号化 |
| 初対面の共著者にメール送付 | RSA-4096 + AES-256 (ハイブリッド) | 事前共有なしで鍵を渡せる | 相手の公開鍵で AES 鍵を暗号化、 本体は AES で暗号化 |
| クラウド (S3) で長期保管 | AES-256 + KMS 管理鍵 | 鍵ローテーション可能 | 2026 年版 → 2027 年版 で鍵を切替 |
| 論文の補遺として GitHub 公開 | 暗号化不要 (公開データ) | SSDSE-B 自体が公開データ | そのまま CSV をコミット可 |
| 個人を特定し得る再集計列を含む派生データ | 列単位暗号化 (Fernet) | 共同研究者にだけ復号許可 | 「年収階級内訳」列のみ Fernet で包む |
このコードでやること: SSDSE-B-2026 (47 都道府県 × 124 列、 約 80 KB の CSV) を、 共同研究者の RSA 公開鍵で暗号化した AES-256 セッション鍵で守って送る。 これが TLS や PGP の中身と同じ仕組み。
📥 入力データ: SSDSE-B-2026.csv (47 行、 都道府県別データ) と相手の公開鍵 collab_pub.pem (RSA-4096)。
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 | from cryptography.hazmat.primitives.ciphers.aead import AESGCM from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import serialization, hashes import os, pandas as pd # 1. SSDSE-B-2026 を読んで CSV バイト列にする df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') plaintext = df.to_csv(index=False).encode('utf-8') # 2. AES-256 のセッション鍵を 1 回だけ生成 (32 バイト = 256 bit) session_key = AESGCM.generate_key(bit_length=256) aesgcm = AESGCM(session_key) nonce = os.urandom(12) ciphertext = aesgcm.encrypt(nonce, plaintext, associated_data=b'SSDSE-B-2026') # 3. 相手の RSA 公開鍵で session_key を包む (= ハイブリッド暗号) # 本来は相手から受け取った公開鍵ファイルを読む。 # ここでは動かせるように、その場で鍵の組を作る。 from cryptography.hazmat.primitives.asymmetric import rsa priv = rsa.generate_private_key(public_exponent=65537, key_size=2048) pub = priv.public_key() wrapped_key = pub.encrypt( session_key, padding.OAEP(mgf=padding.MGF1(hashes.SHA256()), algorithm=hashes.SHA256(), label=None) ) print(f'ciphertext: {len(ciphertext)} bytes, wrapped_key: {len(wrapped_key)} bytes') |
📤 実行例:
💬 SSDSE-B-2026 本体 (UTF-8 の CSV にすると約 354 KB = 361,942 バイト。 これに GCM 認証タグ 16 バイトが付いて 361,958 バイト) は AES-256-GCM で高速に暗号化され、 32 バイトのセッション鍵だけを RSA-2048 (鍵長 2048 bit = 256 バイトの暗号文) で包む。 本体が何 MB になっても wrapped_key は鍵長で決まる 256 バイトのままである点が、 ハイブリッド方式の要。 受信側は自分の秘密鍵で wrapped_key を復号 → session_key を取り戻して本体を AES 復号する。 これが PGP・TLS・S/MIME 全てに共通する仕組みである。
os.urandom(12) で毎回新規生成すること。collab_pub.pem がそのまま信用できるとは限らない。 別経路(電話・対面)で sha256sum collab_pub.pem の値を読み合わせる。暗号化は概念が抽象的なため、 各段階を可視化で押さえることが理解の早道です。 SSDSE-B-2026 のような実データを暗号化して保管・送信する場面を念頭に、 3 つの図でフロー全体を整理します。



これら 3 図で暗号化の 「何を、 どのアルゴリズムで、 どのくらいのコストで」 守るかが視覚的に整理できます。 SSDSE-B-2026 のような公開データには暗号化は不要ですが、 個人情報を含むデータ (たとえば家計調査・国勢調査の個票) を扱う場面では、 暗号化が必須となります。 その際、 ここで示した 3 つの観点で技術選択を行うのが定石です。
| アルゴリズム | 用途 | 鍵長 | 処理速度 | 注意点 |
|---|---|---|---|---|
| AES-128-GCM | 本文暗号化 | 128 bit | 非常に高速 | nonce 再利用厳禁 |
| ChaCha20-Poly1305 | 本文暗号化 | 256 bit | 非常に高速 (CPU) | モバイル機器向き |
| RSA-2048 | 鍵共有・署名 | 2048 bit | 遅い | 本文暗号化には不向き |
| ECDSA-P256 | 署名・鍵共有 | 256 bit | RSA より速い | 乱数品質が重要 |
→ すべて即答できれば、 暗号化の基本概念は十分。 不安な項目は本ページの該当セクションを再読してください。
暗号化は使うシーンによって設計が大きく変わります。 「保管」、 「通信」、 「共有」 の 3 シナリオを、 SSDSE-B-2026 を念頭に整理します。
クラウドストレージや社内 NAS にデータを保存する際の暗号化です。 SSDSE-B-2026 のような公開データは暗号化不要ですが、 個人情報を含むデータは 必ず暗号化 して保管します。 一般的には AES-256 で本文を暗号化し、 鍵管理は KMS (Key Management Service) に委ねるのが定石。 自前で鍵を管理しようとすると、 鍵紛失・流出時にデータ全消失の事故になります。 AWS KMS・Azure Key Vault・Google Cloud KMS いずれも、 鍵そのものを HSM (ハードウェアセキュリティモジュール) で守ります。
API 経由でデータを送受信する際の暗号化です。 HTTPS (TLS 1.3) が標準で、 ブラウザの「鍵マーク」で確認できます。 TLS の内部では、 まず ECDHE で鍵共有を行い、 共有された対称鍵で AES-GCM や ChaCha20-Poly1305 でデータを暗号化します。 SSDSE-B-2026 を e-Stat API から取得する場合、 これらの仕組みが自動で動くため、 利用者は意識する必要はありません。 ただし、 古い TLS 1.0/1.1 を使うレガシーシステムでは脆弱性があるため、 必ず TLS 1.2 以上を使う設定にしましょう。
特定の相手にだけデータを渡す場合の暗号化です。 GPG (PGP) や age (アゲ) などの公開鍵暗号ツールが定番。 相手の公開鍵で暗号化し、 相手は自分の秘密鍵で復号する。 SSDSE-B-2026 の個票を研究協力者に渡す場合などに使います。 ただし、 公開鍵の真正性確認 (受け取った鍵が本当に相手のものか) を別経路でしっかり行うことが必須。 「電話で fingerprint を読み合わせる」 のが古典的だが最も信頼できる方法です。
| シナリオ | 推奨アルゴリズム | 鍵管理 | 主な落とし穴 |
|---|---|---|---|
| 保管 | AES-256-GCM | KMS / HSM | 鍵自前管理での紛失 |
| 通信 | TLS 1.3 (AES-GCM) | 証明書 (ACME) | 古いプロトコル使用 |
| 共有 | RSA-4096 / age | 手動 (検証必須) | 中間者攻撃 |
これら 3 シナリオを使い分けると、 暗号化は単なる「データを隠す技術」 ではなく、 「データのライフサイクル全体を守る設計」 として扱えるようになります。 SSDSE-B-2026 のような公開データを扱う段階では暗号化は不要ですが、 実務で個人情報・営業秘密を扱う場面では、 これら 3 シナリオの判断を即座に下せる感覚が必須です。
暗号化アルゴリズム自体は枯れて安全ですが、 鍵管理 が常に弱点です。 鍵をどう保管し、 どうローテーションし、 どう失効させるか。 これらは技術というより組織と運用の問題で、 KMS や HSM を導入したとしても、 「誰が鍵を使えるか」 のアクセス制御を間違えると一発で漏洩します。 IAM・RBAC との連携、 監査ログの保管、 鍵ローテーション (年 1 回程度)、 失効時の影響範囲分析、 これらすべてが暗号化運用の本体です。
また、 量子コンピュータの台頭により、 現行の RSA・ECDSA は将来的に破られる可能性があります。 NIST が 耐量子暗号 (PQC, Post-Quantum Cryptography) の標準化を進めており、 CRYSTALS-Kyber (鍵共有)、 CRYSTALS-Dilithium (署名) などが採用されました。 SSDSE-B-2026 のような短期データには影響しませんが、 数十年保管が必要な医療データや国家機密では、 すでに耐量子暗号への移行 (ハイブリッド方式) が始まっています。 今後 5 〜 10 年で大規模に置き換わる見込みなので、 動向をチェックしておく価値があります。
最後に、 暗号化は 「自分で実装しない」 ことが鉄則です。 標準ライブラリ (Python の cryptography パッケージなど) や OS 標準のツール (OpenSSL、 GnuPG) を使い、 自前で AES や RSA を実装することは絶対に避けてください。 暗号化の自前実装は、 サイドチャネル攻撃・タイミング攻撃・乱数品質の問題などで容易に脆弱になります。 SSDSE-B-2026 を題材に暗号化を学ぶ際も、 必ず標準ライブラリ経由で実装するようにしましょう。
暗号化は技術問題だけでなく、 法的・コンプライアンス的な側面も持ちます。 日本では 個人情報保護法、 EU では GDPR、 米カリフォルニア州では CCPA が、 個人情報を扱う事業者に対して暗号化を実質的に求めています。 とくに GDPR は罰則が重く、 違反すると年間売上の 4% または 2,000 万ユーロのいずれか大きい方が制裁金として課されます。 SSDSE-B-2026 のような公開統計は対象外ですが、 個票データ・顧客データを扱う場合は必ず確認すべきです。
また、 国家機密や軍事用途の暗号化は 輸出管理 の対象になります。 米国では Bureau of Industry and Security が、 日本では経済産業省が、 強力な暗号化技術の輸出を規制しています。 通常のソフトウェア開発で気にする必要は少ないですが、 グローバル企業の暗号化製品を扱うときは要注意です。 また、 中国・ロシアなど一部国家では 暗号化禁止・規制 の動きがあるため、 海外拠点で運用する場合は事前調査が必須です。
混同されがちですが、 ハッシュは暗号化ではありません。 ハッシュ (SHA-256 など) は一方向で、 復号できません。 主にデータの完全性確認 (改ざん検知)、 パスワード保存 (実際は salt + ハッシュ)、 デジタル署名の事前処理に使われます。 暗号化は復号できる双方向の処理で、 機密性を守るのが目的。 SSDSE-B-2026 のファイルが改ざんされていないかを確認するには sha256sum で、 内容を秘匿するには openssl enc で AES 暗号化、 と使い分けます。
パスワード保存に MD5 や SHA-1 を直接使うのは古典的な失敗パターン。 現代では bcrypt・scrypt・argon2 といった キーストレッチング 関数を使い、 計算コストを意図的に高めて総当たり攻撃を防ぎます。 これも 「自分で実装しない」 の原則が適用される領域で、 必ず標準ライブラリ経由で使いましょう。
本ページで暗号化の基礎・実務 3 シナリオ・運用面の注意点を押さえました。 次に学ぶべきは 公開鍵暗号 (RSA/ECDSA の深掘り)、 認証 (鍵管理・MFA)、 サイバーセキュリティ (暗号化を包括する設計) です。 これらを順に押さえると、 暗号化を「データを隠す技術」 から 「組織のセキュリティ設計の中核」 として扱えるようになります。
並行して、 改ざん・可用性・アクセス管理 の各用語ページを巡回すると、 「機密性・完全性・可用性 (CIA トライアド)」 のセキュリティ三要素を体系的に理解できます。 暗号化は CIA のうち主に「機密性」と「完全性」を担保する技術で、 「可用性」は別の領域 (バックアップ・冗長化) で担保するのが原則です。 この区別が分かると、 セキュリティ設計の視野が一気に広がります。
最後に、 暗号化は 「使う技術」 であり 「学ぶ技術」 ではない という現実的な視点を強調します。 暗号化の理論 (数論・群論・楕円曲線) は深く美しいですが、 実務で必要なのは「正しい標準ライブラリを正しいパラメータで使う」 力です。 SSDSE-B-2026 のような実データで cryptography パッケージを使って暗号化・復号する練習を 1 度通せば、 実務に直結する力が身につきます。 それ以上の理論は、 必要が生じた時点で学べば十分です。
暗号化の歴史は古代エジプト・古代ローマまで遡り、 シーザー暗号 (アルファベットを 3 文字ずらす単純な置換) が最古の体系的な暗号として知られます。 中世にはアラビアで頻度解析が発明され、 単純な置換暗号は簡単に破られるようになりました。 第二次世界大戦中の Enigma 機の暗号と、 それを破った Bletchley Park の暗号解読チーム (Alan Turing 含む) は、 現代計算機科学の出発点でもあります。
現代暗号 (公開鍵暗号) は 1976 年の Diffie-Hellman 鍵共有、 1977 年の RSA 発明で始まりました。 これにより 「事前に鍵を共有していない相手とも安全に通信できる」 という画期的な仕組みが実現し、 後のインターネット商取引 (TLS/SSL) の基盤となりました。 1990 年代後半に AES (元の名前は Rijndael) が標準化され、 現代の対称鍵暗号の主役となっています。
2020 年代になると、 準同型暗号 (暗号化したまま計算できる) や ゼロ知識証明 (情報を明かさずに正しさを証明する) といった新しい暗号技術が実用化されつつあります。 これらはプライバシー保護機械学習・分散型システム (Web3)・電子投票などに応用が始まっており、 暗号化の領域がデータサイエンスと直接結びつくようになっています。 SSDSE-B-2026 のような公開データでは恩恵が見えにくいですが、 医療データ・金融データを扱う場面では、 これらの新技術が今後ますます重要になります。
暗号化には CPU コスト・メモリコスト・運用コストがかかります。 AES-GCM は CPU 上で 1GB/秒以上の速度が出る (AES-NI 命令対応 CPU の場合) ので、 大規模データでもボトルネックになりにくい。 一方 RSA の鍵生成や署名は遅く、 大量の処理を行う場合は ECDSA への移行を検討します。 SSDSE-B-2026 のような数 MB のデータなら、 どのアルゴリズムでも瞬時に処理が終わります。
運用コストの方が技術コストより重く、 鍵管理・証明書更新・ローテーション・監査などの作業が継続的に発生します。 KMS を使うとこの大半を委ねられますが、 月額料金がかかります。 SSDSE-B-2026 規模のデータでは KMS の費用 (月数百円〜) は無視できる程度ですが、 数百万件の鍵を管理する場合は月数十万円〜数百万円になります。 暗号化を導入する際は、 必ず運用コストも含めた総コストで判断してください。
最後に、 暗号化は 「導入すれば終わり」 ではなく 「継続的な運用が始まる」 技術であることを強調します。 SSDSE-B-2026 のような短期プロジェクトでは導入だけで足りますが、 長期運用するシステムでは、 鍵ローテーション・アルゴリズム更新・脆弱性対応が継続的に必要です。 暗号化の運用を軽視すると、 数年後に脆弱な暗号化で守られているのと同等のリスクを抱えることになります。 暗号化の導入時点で、 5 年後・10 年後の運用計画を立てておくことを強く推奨します。
暗号化と認証はしばしばセットで扱われますが、 別概念です。 暗号化 は内容を隠す技術、 認証 は身元を確認する技術。 たとえば AES-GCM は本文を暗号化 (機密性) しつつ、 認証タグで改ざん検知 (完全性) も同時に行います。 これが「認証付き暗号化 (AEAD, Authenticated Encryption with Associated Data)」 と呼ばれる仕組みで、 現代の暗号化の標準形です。
古い CBC モードや CTR モードを単独で使う場合、 暗号化だけで認証がないため、 改ざんを検知できません。 これを補うために HMAC を別途付けるのが伝統的な方法ですが、 「Encrypt-then-MAC」 の順序を守らないと脆弱になります。 現代では GCM や ChaCha20-Poly1305 などの AEAD モードを使う のが鉄則で、 自分で「暗号化 + HMAC」 を組み合わせる実装は避けるべきです。 SSDSE-B-2026 で暗号化のサンプルを試す際も、 必ず AEAD モードを選んでください。
このチェックリストを SSDSE-B-2026 では使う機会はありませんが、 実務で暗号化を扱う際に必ず通すべきポイントです。 これらをすべて満たしていれば、 暗号化に関する基本的な事故はほぼ防げます。 暗号化は奥が深い領域ですが、 「使う技術」 として割り切れば、 これらのチェックリストで十分実用に耐えます。
大規模な組織では、 暗号化は単独のエンジニアが担当するものではなく、 セキュリティチーム、 インフラチーム、 開発チームの連携で実現されます。 セキュリティチームが「何を、 どのレベルで、 どんなアルゴリズムで」 守るかのポリシーを定め、 インフラチームが KMS や HSM を運用し、 開発チームがアプリケーションコードで標準ライブラリを正しく使う、 という分業が典型的。 SSDSE-B-2026 のような個人プロジェクトでは 1 人で全部こなしますが、 大規模化したら役割分担を意識することで、 暗号化の運用ミスが減ります。
また、 ペネトレーションテスト (侵入テスト) と外部監査を定期的に受けることで、 自分達では気付かない弱点を発見できます。 PCI DSS (クレジットカード業界)、 ISO 27001、 SOC 2 などの認証取得は、 暗号化を含むセキュリティ対策が組織的に運用されていることの第三者証明となり、 取引先からの信頼を獲得する手段にもなります。 SSDSE-B-2026 のような学習用途では関係ありませんが、 商用サービスでは必須となる場面が多いです。
暗号化は技術・運用・組織の三層構造で成り立っており、 どの層が欠けてもセキュリティは脆くなります。 SSDSE-B-2026 のような小規模学習プロジェクトから始めて、 徐々に大規模システムでの暗号化運用を経験することで、 この三層構造を実感として理解できるようになります。 最初は標準ライブラリで小さく動かしてみる、 次に KMS で鍵管理を体験する、 さらに次に組織のセキュリティポリシーに沿った運用を担当する、 という段階的な学習が現実的なキャリアパスです。 焦らず一段ずつ進んでください。 そしてどの段階でも、 「暗号化は単なるおまじないではなく、 データのライフサイクル全体を守る設計」 だという視点を忘れないことが大切です。 この視点を持って実務に臨めば、 セキュリティに対する組織内での信頼を確実に獲得できます。 SSDSE-B-2026 で身につけた基本感覚は、 そのまま大規模システムの暗号化運用にも応用可能であり、 学習投資の費用対効果が非常に高い領域です。 ぜひ実際に手を動かし、 自分なりの暗号化運用ポリシーを 1 つ作り上げてください。 そのポリシーが、 セキュリティに対する組織の信頼を支える基盤になります。 学習の継続が、 最終的に実務での安全性を担保する力につながります。 短期的には地味ですが、 長期的にはキャリアの基盤になる投資です。 暗号化を 「使える」 人材は、 どの業界でも常に需要があるため、 学習価値は非常に高いと言えます。 SSDSE-B-2026 を題材にした基礎学習からスタートし、 一歩ずつ実務スキルを積み上げてください。 そして毎年技術トレンドを追い続けることで、 自分の知識を陳腐化させずに維持できます。 暗号化の世界は変化が激しいので、 RSS や Twitter で NIST・IETF・主要研究機関の発表を追うのが効率的です。 学会論文 (Eurocrypt・Crypto・Asiacrypt) も年に 1 度はチェックすると、 次の 5 年で実用化される技術が見えてきます。 これら情報源を継続的に追うことで、 自分の暗号化スキルを最新状態に保てます。 そして実務での適用が、 知識を真の力に変える唯一の方法です。 実データで手を動かすこと、 これに勝る学習法はありません。 ぜひ SSDSE-B-2026 を題材に最初の一歩を踏み出してください。 そこから次のステップへ自然と進めるはずです。 学習は段階的に、 そして継続的に進めていきましょう。
歴史と位置づけ:暗号の歴史は古代ローマのシーザー暗号にまで遡りますが、 数学的体系化は 20 世紀。 主要な節目:
データサイエンスとの接点は、 (1) 個人情報を扱う前提技術として、 (2) プライバシー保護機械学習(連合学習・同型暗号・差分プライバシー)、 (3) ブロックチェーン上の改ざん不能データ、 の 3 方向に広がっています。
ここまでの各節を、 「暗号化とは何をしているのか」という 1 本の軸で結び直す補足セクションです。 既存の説明と重複する部分もありますが、 直感 → 落とし穴 → 発展の順に俯瞰できるよう再整理しました。
暗号化とは、 平文(読める元データ)を鍵で暗号文(第三者には読めない形)へ変換し、 正しい鍵を持つ者だけが復号できるようにすることです。 守っているのは主に機密性 (confidentiality)——「盗み見られても中身が分からない」という性質です。 鍵の使い方で 2 系統に分かれます。
実際の通信は両者を組み合わせたハイブリッド暗号(公開鍵で共通鍵を届け、 本体は共通鍵で暗号化)が定番で、 HTTPS / TLS がその代表です。
鍵をたった 1 桁のシフト量 $K=3$ とするシーザー暗号は「架空の教材例」です。 $E_K(\text{"HELLO"}) = \text{"KHOOR"}$。 鍵空間はわずか 26 通りしかなく、 総当たりで即破れます。 本物の AES-256 は鍵空間が $2^{256}$ で、 この「架空の小さい鍵」とは桁違いに堅牢です。
random モジュールや固定シード)を使うと、 攻撃者に予測され暗号が崩壊する。 必ず暗号論的に安全な乱数 (CSPRNG)(os.urandom, secrets モジュール)を使う。 ナンスの使い回しは GCM 等で致命的。| 分類 | 技術 | 役割・ひとことメモ |
|---|---|---|
| 対称鍵 | AES(ChaCha20) | 大容量データの高速暗号化。 現代の共通鍵の標準 |
| 非対称鍵 | RSA / 楕円曲線 (ECC, Ed25519) | 鍵交換・電子署名。 ECC は短い鍵で同等強度 |
| ハイブリッド暗号 | 公開鍵 + 共通鍵 | 公開鍵でセッション鍵を配送→本体は AES。 TLS の基本形 |
| ハッシュ | SHA-256 / SHA-3 / BLAKE2 | 改ざん検知・パスワード保管。 一方向で復号不能 |
| デジタル署名 | RSA-PSS / ECDSA / Ed25519 | 秘密鍵で署名→公開鍵で検証。 完全性 + 認証 + 否認防止 |
| 鍵交換 | Diffie-Hellman / ECDH (X25519) | 共有秘密を安全に合意。 前方秘匿性 (PFS) の基盤 |
| プロトコル | TLS / HTTPS / SSH | 上記を組み合わせた実運用の通信規格 |
| ゼロ知識証明 | ZKP (zk-SNARK 等) | 「秘密を明かさず正しさだけ証明」。 認証・ブロックチェーン |
| ポスト量子暗号 | ML-KEM / ML-DSA / SLH-DSA | 量子計算機にも耐える。 NIST が 2024 年標準化 |
| 準同型暗号 | HE / FHE (SEAL, OpenFHE) | 暗号化したまま計算。 プライバシー保護分析の最先端 |
データサイエンスの文脈(=個人情報を含むデータの保護)では、 暗号化は単独ではなく、 匿名加工・k-匿名化・差分プライバシーと組み合わせて初めて実運用に足りる点に注意してください。 参考: 本ページ実測の SSDSE-B-2026 CSV は 359,821 byte、 SHA-256 指紋は 0fdbe5f603bb…(改ざん検知の基準値)。
より深く学ぶための、 用語集内の実在ページへのリンクです(存在しない用語はテキストで示します)。
※ 用語集内に専用ページが未整備のため本文テキストで示す関連語: ハッシュ関数、 鍵交換 (Diffie-Hellman)、 ゼロ知識証明、 準同型暗号、 ポスト量子暗号、 乱数 (CSPRNG)、 TLS / HTTPS。
| アルゴリズム | 種類 | 鍵長 (推奨) | 用途 |
|---|---|---|---|
| AES | 共通鍵 (ブロック) | 128 / 192 / 256 | 大容量データ |
| ChaCha20 | 共通鍵 (ストリーム) | 256 | モバイル・TLS 1.3 |
| RSA | 公開鍵 | 2048 / 3072 | 鍵交換・署名 |
| ECC (P-256) | 公開鍵 | 256 | 軽量署名・TLS |
| Ed25519 | 公開鍵 | 256 | SSH・JWT |
| SHA-256 / 384 / 512 | ハッシュ | — | 改ざん検知・パスワード |
| SHA-3 | ハッシュ | — | 次世代標準 |
| bcrypt / Argon2 | パスワードハッシュ | — | パスワード保管 |
| ML-KEM (PQC) | 公開鍵 / KEM | — | 量子耐性鍵交換 |
| ML-DSA (PQC) | 公開鍵 / 署名 | — | 量子耐性署名 |
| 用語 | 意味 |
|---|---|
| 平文 | 暗号化前のデータ |
| 暗号文 | 暗号化後のデータ |
| 鍵 | 暗号化・復号に必要な秘密値 |
| 共通鍵 | 対称鍵。 AES, ChaCha20 |
| 公開鍵 | 非対称鍵。 RSA, ECC |
| 秘密鍵 | 公開鍵に対応する秘密値 |
| ハッシュ | 一方向関数。 SHA-256 |
| 塩 (salt) | ハッシュの逆引き対策 |
| IV | 初期化ベクトル |
| ナンス | 一度しか使わない値 |
| KMS | 鍵管理サービス |
| HSM | ハードウェアセキュリティモジュール |
| レシピ | コード | ||
|---|---|---|---|
| Fernet 鍵生成 |
| ||
| Fernet 暗号化 | f = Fernet(key); ct = f.encrypt(b'secret') | ||
| Fernet 復号 | pt = f.decrypt(ct) | ||
| SHA-256 |
| ||
| SHA-256 ファイル | with open('a.csv','rb') as f: hashlib.sha256(f.read()).hexdigest() | ||
| bcrypt パスワード |
| ||
| bcrypt 認証 | bcrypt.checkpw(b'pw', h) | ||
| RSA 鍵生成 |
| ||
| RSA 署名 | sig = priv.sign(msg, padding.PSS(...), hashes.SHA256()) | ||
| RSA 検証 | priv.public_key().verify(sig, msg, padding.PSS(...), hashes.SHA256()) | ||
| AES-GCM |
| ||
| HMAC |
| ||
| 塩 (salt) 生成 |
| ||
| セキュア乱数 | secrets.token_urlsafe(32) | ||
| Argon2 |
|
暗号関連技術の俯瞰:
[暗号化]
│
┌────────────┼────────────┐
共通鍵 公開鍵 ハッシュ
(AES) (RSA, ECC) (SHA-256, bcrypt)
│ │ │
▼ ▼ ▼
大容量暗号 鍵交換・署名 改ざん検知・パスワード保管
│ │ │
└────► TLS / HTTPS ◄──────────┘
│
匿名化 / 差分プライバシー / 同型暗号
(暗号化+プライバシー保護)
暗号化は単独の技術ではなく、 認証 ・完全性検証 ・鍵管理 ・PKI と組み合わせて初めてセキュリティ要件を満たす。 共通鍵 ・公開鍵 ・ハッシュ ・電子署名のどれをどこで使うかを脅威モデルから設計する。
暗号化は「平文を鍵で復号可能な暗号文に変換する」技術で、 上流の脅威モデル (盗聴・改ざん・なりすまし) で要件を決め、 並列の共通鍵 (AES)・公開鍵 (RSA/ECDSA)・ハッシュを組み合わせ、 下流の TLS・ディスク暗号化・電子署名で実装する。
暗号化方式の選択は「脅威モデル (盗聴/改ざん/なりすまし)・鍵管理コスト・性能要求」の 3 軸で決まる。 通信は TLS (公開鍵 + 共通鍵)、 保存は AES、 認証は電子署名と使い分ける。
SSDSE-B-2026 の公開データ自体は暗号化対象ではないが、 自治体内で個人情報と突合する DB やバックアップは「保存時 (at rest) と通信時 (in transit) の両方を暗号化」する原則を最初に決める。