暗号技術はなぜ重要か
現代のインターネット通信、ファイル保護、デジタル署名など、セキュリティの根幹を支えているのが暗号技術です。パスワードの保存からクレジットカード決済、VPN通信まで、私たちが日常的に利用するあらゆるサービスの裏側で暗号が動いています。
暗号技術は大きく3種類に分類されます。
| 分類 | 代表アルゴリズム | 主な用途 |
|---|---|---|
| 対称暗号 | AES, ChaCha20 | データの暗号化・復号 |
| 非対称暗号(公開鍵暗号) | RSA, ECDSA, X25519 | 鍵交換・デジタル署名 |
| ハッシュ関数 | SHA-256, SHA-3, bcrypt | 完全性検証・パスワード保護 |
対称暗号(共通鍵暗号)
仕組みと特徴
対称暗号は、暗号化と復号に同じ鍵を使う方式です。送信者と受信者が事前に同じ秘密鍵を共有している必要があります。
平文 ──[鍵K で暗号化]──→ 暗号文 ──[鍵K で復号]──→ 平文
- 速度: 非対称暗号の数百〜数千倍高速
- 課題: 鍵の安全な配送問題(鍵をどうやって相手と共有するか)
AES(Advanced Encryption Standard)
AESは現在最も広く使われている対称暗号アルゴリズムです。2001年にNISTが標準化しました。
| 項目 | 内容 |
|---|---|
| 鍵長 | 128 / 192 / 256ビット |
| ブロックサイズ | 128ビット(16バイト)固定 |
| 構造 | SPN(Substitution-Permutation Network) |
| 動作モード | CBC, CTR, GCM など |
AESには複数の「動作モード」があります。古い CBC モードは認証機能がなく、パディングオラクル攻撃に脆弱です。現在は AES-GCM(Galois/Counter Mode)が推奨されます。暗号化と認証(改ざん検知)を同時に行う「認証付き暗号(AEAD)」だからです。
openssl でAES暗号化を体験
ファイルを AES-256-CBC で暗号化(パスワードから鍵を導出)
openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.bin -pbkdf2
復号
openssl enc -d -aes-256-cbc -in encrypted.bin -out decrypted.txt -pbkdf2
鍵とIVを明示的に指定して暗号化(16進数)
openssl enc -aes-256-cbc
-K 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
-iv 0123456789abcdef0123456789abcdef
-in plaintext.txt -out encrypted.bin
非対称暗号(公開鍵暗号)
鍵ペアの概念
非対称暗号では、公開鍵と秘密鍵の2つをペアで使います。
- 公開鍵(Public Key): 誰でも入手・使用できる鍵。暗号化に使う。
- 秘密鍵(Private Key): 所有者だけが持つ鍵。復号・署名に使う。
送信者: 受信者の公開鍵で暗号化 ──→ 暗号文
受信者: 自分の秘密鍵で復号 ←── 暗号文
公開鍵から秘密鍵を逆算することは、現代の計算機では事実上不可能(数学的な一方向性)に設計されています。
RSA(Rivest–Shamir–Adleman)
RSAは1977年に発明された公開鍵暗号の代表格です。大きな整数の素因数分解が困難であるという数学的性質に基づいています。
| 項目 | 内容 |
|---|---|
| 鍵長 | 2048ビット以上を推奨(4096ビットが望ましい) |
| 用途 | 鍵交換・デジタル署名・証明書 |
| 弱点 | 量子コンピュータのShorアルゴリズムで破られる可能性 |
RSA-1024ビット鍵は2010年代に危殆化(危険な状態)とみなされ、主要な標準では廃止されています。現在は最低2048ビット、長期保護が必要なデータには4096ビットを使用してください。
楕円曲線暗号(ECC)
RSAより短い鍵長で同等のセキュリティを実現します。
| セキュリティ強度 | RSA鍵長 | ECC鍵長 |
|---|---|---|
| 112ビット | 2048ビット | 224ビット |
| 128ビット | 3072ビット | 256ビット(例: P-256) |
| 256ビット | 15360ビット | 521ビット |
TLS 1.3ではX25519(楕円曲線ディフィー・ヘルマン)が鍵交換のデフォルトとして採用されています。
openssl でRSA鍵ペアを生成
RSA 4096ビット秘密鍵を生成
openssl genrsa -out private.pem 4096
秘密鍵から公開鍵を抽出
openssl rsa -in private.pem -pubout -out public.pem
鍵の情報を確認
openssl rsa -in private.pem -text -noout | head -20
公開鍵でデータを暗号化
openssl rsautl -encrypt -pubin -inkey public.pem -in plaintext.txt -out encrypted.bin
秘密鍵で復号
openssl rsautl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt
ハッシュ関数
ハッシュ関数の3大性質
ハッシュ関数は任意長のデータを固定長のダイジェスト(ハッシュ値)に変換する関数です。暗号学的に安全なハッシュ関数には以下の性質が求められます。
- 一方向性(原像計算困難性): ハッシュ値から元のデータを復元できない
- 衝突耐性: 同じハッシュ値を持つ2つの異なるデータを見つけられない
- 雪崩効果: 入力を1ビット変えるだけでハッシュ値が大幅に変わる
"Hello" → SHA-256 → 185f8db32921bd46d35...(64文字の16進数)
"Hello!" → SHA-256 → 334d016f755cd6dc58c...(全く異なる値)
SHA-256
SHA-2ファミリーの代表で、出力長は256ビット(32バイト)です。BitcoinのProof of WorkやTLS証明書の署名アルゴリズムなど、広く使われています。
文字列のSHA-256ハッシュを計算
echo -n “Hello, World!” | openssl dgst -sha256
ファイルのSHA-256ハッシュを計算
openssl dgst -sha256 /path/to/file.iso
macOS/Linux標準コマンド
shasum -a 256 file.iso sha256sum file.iso # Linux
複数アルゴリズムで比較
echo -n “password” | openssl dgst -md5 echo -n “password” | openssl dgst -sha1 echo -n “password” | openssl dgst -sha256 echo -n “password” | openssl dgst -sha3-256
MD5とSHA-1は衝突攻撃が実証されており、セキュリティ用途での使用は禁止されています。2017年には「SHAttered攻撃」によってSHA-1の衝突が実証されました。新規システムでは SHA-256 以上を使用してください。
TLS/PKIでの暗号技術の使われ方
HTTPS通信の裏側では、これらの暗号技術がどのように組み合わさっているか見てみましょう。
TLS 1.3 ハンドシェイクの流れ
クライアント サーバー
│ │
│──── ClientHello(鍵共有情報) ────→│ ← 対応暗号スイートを提示
│ │
│←── ServerHello(鍵共有情報) ─────│ ← サーバーが選択
│←── Certificate(X.509証明書) ───│ ← RSA/ECDSA で署名
│←── CertificateVerify ────────────│
│←── Finished ─────────────────────│
│ │
│──── Finished ──────────────────→ │
│ │
│←═══════ 暗号化された通信(AES-GCM)════════→│
- 鍵交換: X25519(楕円曲線DH)で共有秘密を生成
- 証明書検証: RSAまたはECDSAで署名を検証
- データ暗号化: AES-GCM または ChaCha20-Poly1305
TLS 1.2では2往復のハンドシェイクが必要でしたが、TLS 1.3は1往復(1-RTT)で完了し、セキュリティと速度が向上しました。また、弱いアルゴリズム(RC4, 3DES, MD5, SHA-1など)が廃止されています。
TLSサーバーの証明書情報を確認
サーバーのTLS証明書情報を確認
openssl s_client -connect example.com:443 -showcerts < /dev/null 2>/dev/null |
openssl x509 -text -noout | grep -A2 “Subject|Issuer|Not”
TLSバージョンと暗号スイートを確認
openssl s_client -connect example.com:443 < /dev/null 2>&1 |
grep -E “Protocol|Cipher”
証明書の有効期限のみ確認
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null |
openssl x509 -noout -dates
デジタル署名の仕組み
デジタル署名は「このデータは確かに私が作成し、改ざんされていない」ことを証明します。
署名の手順
【署名者】
1. データのハッシュを計算(SHA-256など)
2. ハッシュを自分の秘密鍵で暗号化 → これが「署名」
【検証者】
1. 受信したデータのハッシュを計算
2. 署名を送信者の公開鍵で復号してハッシュを取り出す
3. 2つのハッシュが一致すれば、署名は正当
コード署名・ソフトウェア配布での活用
秘密鍵でファイルに署名(SHA-256ハッシュを使用)
openssl dgst -sha256 -sign private.pem -out signature.sig document.txt
公開鍵で署名を検証
openssl dgst -sha256 -verify public.pem -signature signature.sig document.txt
出力: Verified OK(一致)または Verification Failure(不一致)
Gitコミットへの署名確認
git log —show-signature -1
PKIは公開鍵の正当性を証明する仕組みです。認証局(CA)が公開鍵に署名することで「この公開鍵は確かに example.com のものです」と保証します。ブラウザには信頼するCAのリストが組み込まれており、TLS証明書の検証に使われます。
暗号技術の選択ガイドライン(2025年版)
| 用途 | 推奨アルゴリズム | 非推奨 |
|---|---|---|
| データの暗号化 | AES-256-GCM | DES, 3DES, RC4 |
| 鍵交換 | X25519, ECDH P-256 | RSA鍵交換(Forward Secrecyなし) |
| デジタル署名 | Ed25519, ECDSA P-256 | RSA-1024, MD5with RSA |
| パスワードハッシュ | Argon2id, bcrypt, scrypt | MD5, SHA-1, SHA-256(素) |
| データ完全性検証 | SHA-256, SHA-3 | MD5, SHA-1 |
| 耐量子署名(長期保護) | ML-DSA (FIPS 204), SLH-DSA (FIPS 205) | RSA, ECDSA(量子脅威下) |
| 耐量子鍵カプセル化 | ML-KEM (FIPS 203) | RSA-KEM, ECDH(量子脅威下) |
「自分だけの秘密のアルゴリズム」は安全ではありません。暗号の強度は秘密にすることではなく、数学的な困難性に基づいています(Kerckhoffsの原理)。実装には必ず検証済みのライブラリ(OpenSSL, libsodium, BoringSSLなど)を使用してください。
ポスト量子暗号(PQC)— 2025年の新標準
量子コンピュータが暗号を脅かす理由
現在のRSAや楕円曲線暗号は、特定の数学問題(素因数分解・離散対数問題)の計算困難性に基づいています。量子コンピュータで動作するShorのアルゴリズムは、これらの問題を多項式時間で解けるため、RSA-2048も楕円曲線P-256も理論上は破られます。
攻撃者は今日の暗号通信を記録しておき、将来の量子コンピュータで復号する「今収穫・後解読(HNDL)攻撃」をすでに実施しています。医療記録・国家機密・長期契約など機密性の高いデータは、量子コンピュータが実用化される前から移行を始める必要があります。
NIST PQC 標準(2024年8月正式化)
2024年8月、米国国立標準技術研究所(NIST)は世界初のポスト量子暗号標準3本を正式発布しました。
| 標準 | 名称 | 元アルゴリズム | 用途 |
|---|---|---|---|
| FIPS 203 | ML-KEM | CRYSTALS-Kyber | 鍵カプセル化(鍵交換) |
| FIPS 204 | ML-DSA | CRYSTALS-Dilithium | デジタル署名 |
| FIPS 205 | SLH-DSA | SPHINCS+ | デジタル署名(代替) |
ML-KEM(Module-Lattice-based Key Encapsulation Mechanism) が鍵交換の主役として推奨されています。格子問題(Lattice Problem)に基づいており、量子コンピュータでも解くことが困難とされています。
移行の現状
現在の標準 → ポスト量子標準
─────────────────────────────────────
RSA / ECDH → ML-KEM (FIPS 203)
RSA-PSS / ECDSA → ML-DSA (FIPS 204)
Ed25519 → SLH-DSA (FIPS 205) または ML-DSA
TLS 1.3 への PQC 組み込みは標準化が進んでおり、Googleは Chrome で X25519Kyber768(X25519 と ML-KEM の組み合わせ)を試験運用しています。
移行期間中は「古典暗号 + PQC」を組み合わせたハイブリッド方式が推奨されます。どちらかが破られても安全性が保たれるためです。IETF は TLS/SSH 向けのハイブリッド鍵交換仕様を標準化中です。
AES-GCM が AES-CBC よりも推奨される主な理由はどれですか?