暗号技術はなぜ重要か

現代のインターネット通信、ファイル保護、デジタル署名など、セキュリティの根幹を支えているのが暗号技術です。パスワードの保存からクレジットカード決済、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-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ビットは廃止済み

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大性質

ハッシュ関数は任意長のデータを固定長のダイジェスト(ハッシュ値)に変換する関数です。暗号学的に安全なハッシュ関数には以下の性質が求められます。

  1. 一方向性(原像計算困難性): ハッシュ値から元のデータを復元できない
  2. 衝突耐性: 同じハッシュ値を持つ2つの異なるデータを見つけられない
  3. 雪崩効果: 入力を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は使用禁止

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 との違い

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(公開鍵基盤)とは

PKIは公開鍵の正当性を証明する仕組みです。認証局(CA)が公開鍵に署名することで「この公開鍵は確かに example.com のものです」と保証します。ブラウザには信頼するCAのリストが組み込まれており、TLS証明書の検証に使われます。


暗号技術の選択ガイドライン(2025年版)

用途推奨アルゴリズム非推奨
データの暗号化AES-256-GCMDES, 3DES, RC4
鍵交換X25519, ECDH P-256RSA鍵交換(Forward Secrecyなし)
デジタル署名Ed25519, ECDSA P-256RSA-1024, MD5with RSA
パスワードハッシュArgon2id, bcrypt, scryptMD5, SHA-1, SHA-256(素)
データ完全性検証SHA-256, SHA-3MD5, 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も理論上は破られます。

今すぐ行動が必要な理由:Harvest Now, Decrypt Later

攻撃者は今日の暗号通信を記録しておき、将来の量子コンピュータで復号する「今収穫・後解読(HNDL)攻撃」をすでに実施しています。医療記録・国家機密・長期契約など機密性の高いデータは、量子コンピュータが実用化される前から移行を始める必要があります。

NIST PQC 標準(2024年8月正式化)

2024年8月、米国国立標準技術研究所(NIST)は世界初のポスト量子暗号標準3本を正式発布しました。

標準名称元アルゴリズム用途
FIPS 203ML-KEMCRYSTALS-Kyber鍵カプセル化(鍵交換)
FIPS 204ML-DSACRYSTALS-Dilithiumデジタル署名
FIPS 205SLH-DSASPHINCS+デジタル署名(代替)

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 よりも推奨される主な理由はどれですか?