ふくふくHukuhuku LLC
EP.10CS Basics対象: 中2以上 10分公開: 更新:

暗号と認証:共通鍵・公開鍵・ハッシュの使い分け

HTTPS の中身、なぜ通信は盗聴されないか、パスワードはどう保管すべきか。古代ローマのシーザー暗号から現代の RSA / 楕円曲線暗号まで、Python で動かしながら理解する。

#暗号#認証#HTTPS#ハッシュ#セキュリティ
執筆 / 監修
松尾 亮合同会社ふくふく 代表社員

データ基盤・データパイプライン構築 / BI / 生成 AI 活用支援を専門とするエンジニア (28 年)。 本記事は AI 利用ポリシーに基づき、生成 AI の補助で執筆 → 人間が監修・編集して公開しています。

プロフィール詳細
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

暗号は「秘密を守る技術」、認証は「相手が本物か確かめる技術」。インターネット時代、両方が無いと安全な通信はできません。本記事は基本 3 要素 (共通鍵・公開鍵・ハッシュ) と HTTPS の中身を扱います。

1. 暗号の 3 大用途

  • 機密性: 第三者に内容を見られない (盗聴対策)
  • 完全性: 内容が改ざんされていない (ハッシュで検知)
  • 認証: 相手が本人である (公開鍵で証明)

2. シーザー暗号 (古代の入門編)

アルファベットを N 文字ずらすだけ
Python
def caesar_encrypt(text, shift):    result = ""    for c in text:        if c.isupper():            result += chr((ord(c) - 65 + shift) % 26 + 65)        elif c.islower():            result += chr((ord(c) - 97 + shift) % 26 + 97)        else:            result += c    return result
print(caesar_encrypt("HELLO", 3))   # 'KHOOR'print(caesar_encrypt("KHOOR", -3))  # 'HELLO' で復号
# 弱点: 26 通り全部試せばすぐ破られる

3. 共通鍵暗号 (AES)

  • AES (Advanced Encryption Standard): 現代の標準、128/192/256 ビット鍵
  • 特徴: 高速、鍵が短くて済む、対称 (暗号化と復号が同じ鍵)
  • 課題: 鍵をどうやって相手に共有するか (これが公開鍵暗号で解決)
  • 用途: HTTPS の本通信、ファイル暗号化、Wi-Fi (WPA2/3)

4. 公開鍵暗号 (RSA / 楕円曲線)

  • 鍵が 2 つ: 公開鍵 (世界に公開) + 秘密鍵 (本人のみ保持)
  • 暗号化: 公開鍵で暗号化 → 秘密鍵で復号
  • 署名: 秘密鍵で署名 → 公開鍵で検証
  • RSA: 大きな素数の分解の困難さに依存、鍵長 2048-4096 ビット
  • 楕円曲線 (ECC): より短い鍵で同等の強度、現代の主流
  • 遅い: AES の 100-1000 倍遅い、なので「鍵交換」だけに使う

5. ハッシュ関数

Python のハッシュライブラリ
Python
import hashlib
# SHA-256 で文字列をハッシュ化text = "Hello, World!"h = hashlib.sha256(text.encode())print(h.hexdigest())# → dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
# パスワード用には bcrypt or argon2 を使う (低速ハッシュ)# import bcrypt# hashed = bcrypt.hashpw(b"my_password", bcrypt.gensalt())

6. HTTPS の中身 (TLS ハンドシェイク)

  1. 1Client Hello: ブラウザが「対応する暗号方式リスト」を送る
  2. 2Server Hello + 証明書: サーバが暗号方式を選択 + 公開鍵証明書を送る
  3. 3証明書検証: ブラウザが認証局 (CA) のチェーンを確認
  4. 4鍵交換: 公開鍵を使って共通鍵を安全に交換
  5. 5本通信: 共通鍵で AES 暗号化された HTTP 通信

7. パスワードの正しい保管

やり方評価
平文で保存❌ 絶対 NG (DB 漏れた瞬間全員アウト)
MD5 ハッシュ❌ レインボーテーブル攻撃で破られる
SHA-256 ハッシュ❌ 速すぎて総当たり攻撃に弱い
SHA-256 + ソルト△ ソルト追加で改善するが依然速い
bcrypt / argon2✅ 推奨。意図的に低速で総当たりを困難に

8. 次の話

EP.11 では データベースの基礎 に。SQL と関係モデル、インデックス、トランザクションを扱います。

よくある質問

共通鍵暗号と公開鍵暗号の違い
**共通鍵**: 同じ鍵で暗号化と復号 (高速、鍵共有が課題)。**公開鍵**: 公開鍵で暗号化、秘密鍵で復号 (低速だが鍵共有不要)。HTTPS では「公開鍵で共通鍵を安全に交換 → 共通鍵で本通信」のハイブリッド方式。
ハッシュ関数って暗号?
**ハッシュは「一方向」関数** (入力→出力は計算可能、出力→入力は計算困難)。暗号化 (元に戻せる) とは別物。パスワード保管・改ざん検知・電子署名・ブロックチェーンなど用途は広い。
MD5 / SHA-1 はもう使うな?
**衝突攻撃** (異なる入力で同じハッシュ) が現実的に発見されているため、新規採用は禁止。SHA-256 (SHA-2 ファミリ) または SHA-3 を使う。パスワード用途は **bcrypt / argon2** (低速ハッシュ) を使う。
電子署名って何?
**「このデータを送ったのは確かに本人」** を保証する仕組み。送信者は秘密鍵でハッシュを暗号化 (=署名)、受信者は公開鍵で復号して照合。改ざん検知 + なりすまし防止。HTTPS 証明書、PDF 署名、Git commit 署名等で使われる。
量子コンピュータが来たら暗号は破られる?
**RSA / 楕円曲線暗号は量子コンピュータで破られる可能性** がある (Shor のアルゴリズム)。**耐量子暗号 (PQC)** という新方式が NIST で標準化進行中 (2024-25 年)。共通鍵 / ハッシュは耐量子性が比較的高い。
シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp