論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
暗号化
Encryption / Cryptography
セキュリティ / データ保護

🔖 キーワード索引

このページで扱う主要キーワード(クリックで該当セクションへ):

共通鍵暗号 公開鍵暗号 AES RSA 楕円曲線暗号 ECC ハッシュ関数 TLS / HTTPS 認証 / 署名 鍵管理 KMS 個人情報保護 k-匿名化 差分プライバシー

💡 30秒で分かる結論

📍 あなたが今見ているもの

暗号化」 (Encryption / Cryptography) は、 SSDSE-B-2026 などの公的統計データを使った教材・分析で頻出するキーワードです。 本ページでは、 まず直感、 次に数式、 そして 47 都道府県の実値で確かめる、 という流れで体系的に整理します。 加えて、 ケーススタディ・FAQ・歴史的経緯・参考文献までを 1 ページに集約し、 用語の「地図」として使えるようにしました。

関連用語(前提・並列・発展)と関連グループ教材も末尾にまとめてあるので、 用語の地図として活用してください。

🎨 直感で掴む

暗号化はデータを 意味不明な形(暗号文)に変換し、 鍵(key) を持つ者だけが復号できるようにする技術。 データサイエンスでは個人情報を扱う場面が頻発するため、 暗号化と関連概念(ハッシュ、 匿名化、 差分プライバシー)は必修です。

大別すると 2 方式:

実運用では ハイブリッド方式が主流。 公開鍵で「セッション鍵(共通鍵)」を安全に渡し、 大容量データはセッション鍵(AES)で暗号化します。 HTTPS / TLS はまさにこの構成。

📐 数式・定義

共通鍵暗号は概念的に:

【共通鍵暗号】
$$C = E_K(M),\quad M = D_K(C)$$

$M$=平文、 $C$=暗号文、 $K$=鍵、 $E,D$=暗号化/復号アルゴリズム。

公開鍵暗号(RSA の簡略):

【RSA】
$$C = M^e \bmod n,\quad M = C^d \bmod n$$

$(e,n)$ は公開鍵、 $d$ は秘密鍵。 $n = pq$(大きな素数 2 つの積)の素因数分解が困難であることに安全性が基づく。

【ハッシュ関数 H(暗号化ではないが密接)】
$$H: \{0,1\}^* \to \{0,1\}^n,\;\; \text{衝突困難}: H(x)=H(y)\Rightarrow x=y\;(\text{計算量的に})$$

SHA-256 などはパスワード保管・改ざん検知に使う。 一方向性が要件。

🔬 数式・概念を言葉で読み解く

用語意味
平文暗号化前のメッセージ「住所=東京都...」
暗号文変換後のデータ「3f8a9c...」
暗号化/復号に必要な秘密の文字列AES-256 は 256 ビット
共通鍵 (対称)暗号化と復号で同じ鍵AES、 ChaCha20
公開鍵 (非対称)異なる 2 つの鍵 (公開鍵 + 秘密鍵)RSA、 ECC、 Ed25519
ハッシュ固定長への一方向変換SHA-256、 SHA-3
電子署名送信者を保証する仕組み秘密鍵で署名 → 公開鍵で検証
鍵管理 (KMS)鍵をどう生成・保管・廃棄するかAWS KMS、 HSM
匿名化個人を特定不能にする処理k-匿名化、 差分プライバシー

🧮 実値で計算してみる(SSDSE-B-2026)

実値計算:SSDSE データの「半匿名化」と暗号化保管

SSDSE-B-2026 そのものは 47 都道府県集計値で個人情報は含まれませんが、 仮にここに「個人レベルの住民データ」を結合する想定で安全策を考えます。

  1. 列レベル暗号化:氏名・住所など準識別子を Fernet (AES-128-CBC + HMAC) で暗号化。 復号には Master Key が必要。
  2. ハッシュ化:SHA-256 で「マイナンバー」→ 64 文字の固定長文字列に変換、 元に戻せない。
  3. k-匿名化:年齢を 5 歳刻みでビン化、 住所を市区町村レベルに丸める。 都道府県集計(SSDSE 形式)はこの究極形。

パスワード保管の典型構成:

  • パスワード → 塩 (salt, 16-32 バイト) を付加 → bcrypt / scrypt / Argon2 で「コスト」付きハッシュ化
  • DB に bcrypt $2b$12$... のような文字列だけ保存
  • 万一漏洩しても、 計算機リソース×塩のせいで一斉解読が困難

🐍 Python 実装

例 1:Fernet(対称暗号、 すぐ使える AES ベース)

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))

例 2:SSDSE データの列を Fernet で暗号化保管(個人情報結合想定)

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())

例 3:SHA-256 ハッシュでデータ改ざん検知

import hashlib

with open('data/raw/SSDSE-B-2026.csv', 'rb') as fp:
    digest = hashlib.sha256(fp.read()).hexdigest()
print('CSV の SHA-256:', digest)
# このダイジェストを別途記録しておけば、 ファイルが書き換えられたら検出できる

例 4:RSA で電子署名(送信元証明)

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 = b'SSDSE-B-2026 集計結果 2026-05-20'
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')

例 5:パスワードハッシュ(bcrypt)

import bcrypt
pw = b'mySecretP@ss123'
hashed = bcrypt.hashpw(pw, bcrypt.gensalt(rounds=12))
print(hashed)
print('一致?:', bcrypt.checkpw(pw, hashed))

📂 ケーススタディ・追加実装例

ケース 1:HTTPS の中身(ハイブリッド暗号)

  1. クライアントがサーバの証明書(公開鍵)を取得
  2. クライアントが乱数からセッション鍵を生成 → サーバの公開鍵で暗号化して送信
  3. 以後の通信はセッション鍵(AES)で暗号化、 高速通信
  4. TLS 1.3 では Diffie-Hellman 鍵交換で前方秘匿性も確保

ケース 2:パスワード保管のレイヤー

レベル方式安全性
1平文保存論外
2MD5 / SHA1 のみレインボーテーブルで一斉復元 → 危険
3塩 + SHA-256個別解読は必要だが GPU で高速
4bcrypt / scrypt / Argon2計算コスト調整可、 推奨

ケース 3:個人情報結合データの暗号化保管

import pandas as pd
from cryptography.fernet import Fernet

# 1) マスター鍵を環境変数から(コード/DB には書かない)
import os
key = os.environ['DATA_KEY'].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')

ケース 4:JWT(JSON Web Token)の構造

「ヘッダ.ペイロード.署名」の 3 つを base64 で連結。 署名は HMAC-SHA256 または RSA。 認証 API で頻出。

ケース 5:差分プライバシー(暗号化との補完)

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))

ケース 6:ポスト量子暗号(PQC)

2024 年に NIST が標準化した次世代アルゴリズム:

RSA・ECC は量子計算機の Shor アルゴリズムで破られるため、 中長期で PQC への移行が進む。

🪜 ステップバイステップ チュートリアル

チュートリアル:個人情報結合データの安全な扱い

ステップ 1:脅威モデルを決める

ステップ 2:鍵を作って環境変数へ

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:列暗号化

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:ハッシュ化(一方向)

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 のチェックサム

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 を立てる。

🚀 現場での応用シナリオ(8 例)

応用 1:HTTPS / TLS

Web 通信の暗号化。 公開鍵で鍵交換 → 共通鍵で大容量データ。 ブラウザの鍵マークの背後。

応用 2:パスワード保管

bcrypt / Argon2 + 塩。 漏洩 DB でも個別パスワードを守る。 標準実装は passlib

応用 3:データベース暗号化

Transparent Data Encryption (TDE)、 列暗号化、 Always Encrypted。 個人情報列を選択的に保護。

応用 4:電子署名と認証

JWT、 PDF 電子署名、 マイナンバーカード。 「本人が出した」を暗号で証明。

応用 5:ブロックチェーン

ハッシュチェーン + 公開鍵署名で改ざん不能な台帳。 暗号通貨・NFT・サプライチェーン追跡。

応用 6:連合学習 (Federated Learning)

「データは送らず、 モデル更新だけ送る」。 暗号化通信 + 差分プライバシーで医療・金融データの連携学習。

応用 7:同型暗号

「暗号化したまま計算する」最先端技術。 クラウドに復号鍵を渡さずに分析。

応用 8:マイナンバーカード

IC チップ内の秘密鍵で電子署名。 行政手続きのデジタル化の基盤技術。

🏋️ 演習問題(8 題)

  1. Fernet で短いテキストを暗号化・復号せよ。
  2. SSDSE-B-2026 の「地域コード」列を暗号化して別ファイルに保存せよ。
  3. SHA-256 で「マイナンバー」風の文字列を 100 件ハッシュ化せよ。
  4. bcrypt でパスワードを保存し、 認証ロジックを実装せよ。
  5. RSA 鍵ペアを生成し、 短いメッセージに電子署名を付けよ。
  6. TLS バージョンと暗号スイートを openssl s_client で確認せよ。
  7. k-匿名化(K=5)を SSDSE 結合データに適用するスクリプトを書け。
  8. 差分プライバシーで集計値にノイズを加え、 ε と精度のトレードオフを示せ。

🗺 学習ロードマップ

  1. レベル 1 — 共通鍵 vs 公開鍵、 ハッシュ関数の役割を区別。
  2. レベル 2 — Fernet で AES 暗号化、 SHA-256 でハッシュ。 Python の cryptography ライブラリ。
  3. レベル 3 — RSA 鍵生成、 電子署名、 検証。
  4. レベル 4 — TLS の仕組み、 X.509 証明書、 認証局(CA)。
  5. レベル 5 — 鍵管理(KMS、 HSM)、 ローテーション、 セッション暗号、 PFS。
  6. レベル 6 — 同型暗号、 ゼロ知識証明、 ポスト量子暗号(PQC)、 連合学習。

📊 比較表(兄弟手法・選択肢)

主要暗号アルゴリズムの比較

アルゴリズム種類鍵長 (推奨)用途
AES共通鍵 (ブロック)128 / 192 / 256大容量データ
ChaCha20共通鍵 (ストリーム)256モバイル・TLS 1.3
RSA公開鍵2048 / 3072鍵交換・署名
ECC (P-256)公開鍵256軽量署名・TLS
Ed25519公開鍵256SSH・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ハードウェアセキュリティモジュール

🍳 コードレシピ(コピペ用 15 連発)

レシピコード
Fernet 鍵生成
from cryptography.fernet import Fernet
key = Fernet.generate_key()
Fernet 暗号化
f = Fernet(key); ct = f.encrypt(b'secret')
Fernet 復号
pt = f.decrypt(ct)
SHA-256
import hashlib; hashlib.sha256(b'hello').hexdigest()
SHA-256 ファイル
with open('a.csv','rb') as f: hashlib.sha256(f.read()).hexdigest()
bcrypt パスワード
import bcrypt; h = bcrypt.hashpw(b'pw', bcrypt.gensalt(12))
bcrypt 認証
bcrypt.checkpw(b'pw', h)
RSA 鍵生成
from cryptography.hazmat.primitives.asymmetric import rsa
priv = rsa.generate_private_key(65537, 2048)
RSA 署名
sig = priv.sign(msg, padding.PSS(...), hashes.SHA256())
RSA 検証
priv.public_key().verify(sig, msg, padding.PSS(...), hashes.SHA256())
AES-GCM
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
aesgcm = AESGCM(key); ct = aesgcm.encrypt(nonce, pt, aad)
HMAC
import hmac, hashlib; h = hmac.new(key, msg, hashlib.sha256).hexdigest()
塩 (salt) 生成
import secrets; salt = secrets.token_bytes(16)
セキュア乱数
secrets.token_urlsafe(32)
Argon2
from argon2 import PasswordHasher
ph = PasswordHasher(); hash_ = ph.hash('pw')

⚠️ よくある落とし穴

❌ 「暗号化=匿名化」ではない
暗号化は復号鍵があれば戻せる、 ハッシュ化は復号できないがレインボーテーブル攻撃に脆弱。 匿名化(k-匿名化・差分プライバシー)と組み合わせる必要がある。
❌ 鍵管理の甘さ
鍵を平文でリポジトリにコミット、 鍵と暗号文を同じサーバに置く、 鍵をローテーションしない、 などが漏洩経路の上位。 KMS や HSM の利用、 環境変数化を徹底。
❌ 古いアルゴリズムの利用
DES、 MD5、 SHA-1 は既に破られている/攻撃が現実的。 AES-256、 SHA-256/3、 RSA 2048bit 以上、 ECC P-256 などを使う。
❌ 塩 (salt) なしのハッシュ
同じパスワードが同じハッシュになると、 漏洩 DB から一斉に逆引きされる。 塩を必ず付ける、 さらに bcrypt/Argon2 のように計算コストを上げる。
❌ 法令・規程の見落とし
個人情報保護法・GDPR は 暗号化していても「個人情報」の扱いを規定する。 暗号化は安全策の一部であって、 同意取得・最小化原則・削除権の代替にはならない。

❓ よくある質問(FAQ)

Q: 暗号化したからもう個人情報じゃない?
A: 違う。 鍵があれば復号できる以上、 暗号化されたデータも「個人情報」扱い。 匿名化(k-匿名化・差分プライバシー)と組合せる。
Q: AES-128 と AES-256、 どちらが安全?
A: どちらも実用上十分。 ただし量子計算機の Grover アルゴリズムで実効強度が半減するので、 長期保存なら AES-256。
Q: パスワードのハッシュは SHA-256 で十分?
A: 単独では不十分。 塩 (salt) を付け、 bcrypt / scrypt / Argon2 のような「コスト調整可能」アルゴリズムを使う。
Q: 鍵をどこに保存する?
A: コード・リポジトリには絶対に書かない。 KMS(AWS KMS、 Azure Key Vault)、 HSM、 環境変数(CI/CD で注入)など。
Q: 量子計算機が来たら今の暗号は破られる?
A: 公開鍵(RSA・ECC)は Shor アルゴリズムで原理的に破られる。 共通鍵(AES)は Grover で半減するだけ。 NIST のポスト量子暗号への移行が進行中。

📜 歴史と背景

歴史と位置づけ:暗号の歴史は古代ローマのシーザー暗号にまで遡りますが、 数学的体系化は 20 世紀。 主要な節目:

データサイエンスとの接点は、 (1) 個人情報を扱う前提技術として、 (2) プライバシー保護機械学習(連合学習・同型暗号・差分プライバシー)、 (3) ブロックチェーン上の改ざん不能データ、 の 3 方向に広がっています。

🗺 概念マップ

暗号関連技術の俯瞰:

              [暗号化]
                 │
    ┌────────────┼────────────┐
共通鍵          公開鍵         ハッシュ
(AES)       (RSA, ECC)   (SHA-256, bcrypt)
   │              │              │
   ▼              ▼              ▼
大容量暗号    鍵交換・署名   改ざん検知・パスワード保管
   │              │              │
   └────► TLS / HTTPS ◄──────────┘
              │
       匿名化 / 差分プライバシー / 同型暗号
            (暗号化+プライバシー保護)

📚 参考文献・出典