SIGMA-SE Math & Tech Library

SIGMA-SE Math & Tech Library


数学と情報技術をテーマに、書籍や教材だけではつかみにくい考え方を具体例とともに簡潔にわかりやすく伝える解説サイトです。
技術の歴史や背景、関連知識の整理、学習のための覚書や要約記事も掲載しています。

情報セキュリティ - 暗号技術:9/10 実用暗号とTLSの仕組み

概要

Web通信やアプリケーションで使われる実用暗号標準について、AES、ハッシュ関数、メッセージ認証、AEAD(Authenticated Encryption with Associated Data)、TLS(Transport Layer Security)を中心に説明する。

現代の暗号利用では、暗号化だけでなく、改ざん検知、認証、鍵交換を組み合わせて安全性を保つ。
DESの限界を受けてAESが標準化され、TLSやAEADのような実用的な組み合わせが広く使われるようになった。

この記事の構成

現代の共通鍵暗号として使われるAES

  • DESの後継標準

    AES(Advanced Encryption Standard)は、DESの後継として標準化された共通鍵ブロック暗号となる。

    AESは128ビットのブロックを扱い、鍵長として128ビット、192ビット、256ビットを使える。
    現在でも、ファイル暗号化、VPN、TLS、ストレージ暗号化など、多くの場面で使われている。

  • Rijndael

    AESは、Rijndaelというブロック暗号をもとに標準化された。

    DESのような古い鍵長の問題を避けるため、より長い鍵と現代的な設計を持つ。
    ただし、AESそのものが強くても、利用モードや鍵管理を誤ると安全性は下がる。

ブロック暗号の利用モード

  • なぜ利用モードが必要か

    ブロック暗号は固定長のブロックを変換するため、そのまま長いデータ全体を安全に扱うには工夫が必要になる。

    同じ平文ブロックを同じ鍵で暗号化すると同じ暗号文になるような使い方は避ける必要がある。
    そこで、CBC、CTR、GCMなどの利用モードが使われる。

  • 代表的な利用モード
    モード 特徴 注意点
    CBC前の暗号文ブロックを次の処理に使う。初期化ベクトルとパディング検証に注意が必要。
    CTRカウンタから鍵ストリームを作る。同じ鍵とnonceの再利用を避ける。
    GCM暗号化と認証タグを組み合わせる。nonceの再利用が危険。

ハッシュ関数とメッセージ認証

  • ハッシュ関数

    ハッシュ関数は、入力データから固定長の値を作る関数となる。

    同じ入力からは同じハッシュ値が得られるが、ハッシュ値から元の入力を戻すことは難しい。
    ファイルの改ざん検知、署名対象データの要約、パスワード保存の前処理など、多くの用途で使われる。

    ただし、データとハッシュ値を同じ場所から取得するだけでは、攻撃者に両方を差し替えられる可能性がある。
    改ざんされていないことを信頼して確認するには、ハッシュ値を別の信頼できる経路で入手するか、HMACやデジタル署名などの認証手段を組み合わせる。

  • SHA-1からSHA-2、SHA-3へ

    古いハッシュ関数であるMD5やSHA-1は、衝突攻撃の問題により、新しい用途では避けるべきものになった。

    現在は、SHA-256などのSHA-2系列や、SHA-3系列を使うのが基本となる。
    ハッシュ関数も暗号方式と同じように、古い方式を使い続けないことが重要になる。

  • HMACとKDF

    HMACは、秘密鍵とハッシュ関数を組み合わせてメッセージ認証を行う仕組みとなる。

    KDF(Key Derivation Function)は、共有秘密やパスワードなどから、用途に合わせた鍵を導出する仕組みとなる。
    鍵交換で得た共有値をそのまま使うのではなく、KDFでセッション鍵へ変換することが多い。

    ハッシュは「固定長の要約」を作り、HMACはそこに秘密鍵を組み合わせて「鍵を知る相手だけが作れる確認値」を作る。
    暗号化とは違い、内容を隠すのではなく、改ざん検知や認証の部品として使う。

AEAD

  • 暗号化と認証をまとめる

    AEAD(Authenticated Encryption with Associated Data)は、暗号化と改ざん検知をまとめて扱う考え方となる。

    AEADでは、平文を暗号文に変換するだけでなく、認証タグを作る。
    受信側はタグを検証し、改ざんがあれば復号結果を信用しない。

    AEADは、入力と出力を分けると役割が見えやすい。
    図では、暗号化される平文と、暗号化されないがタグに含まれるAADを分けて見る。

    AEADが鍵・nonce・平文・AADから暗号文と認証タグを生成する流れ

    分類 データ 扱い
    入力鍵、nonce、平文暗号文を作るために使う。
    入力AAD暗号化しないが、改ざん検知には含める。
    出力暗号文平文を隠した結果。
    出力認証タグ改ざんされていないか確認するための値。
  • AAD

    AAD(Associated Data)は、暗号化はしないが改ざん検知には含めるデータとなる。

    例えば、通信ヘッダの一部は隠す必要がないが、勝手に変更されると困る場合がある。
    このようなデータをAADとして扱うことで、暗号文と一緒に完全性を確認できる。

TLSとHTTPS

  • TLSの役割

    TLSは、通信相手の確認、鍵交換、暗号化、改ざん検知をまとめて扱うプロトコルとなる。

    Webサイトで使われるHTTPSは、HTTP通信をTLSで保護したものと考えると分かりやすい。
    TLSでは、証明書でサーバーを確認し、鍵交換によってセッション鍵を作り、その後の通信を共通鍵暗号で守る。

    TLSの流れを単純化すると、次のようになる。

    1. サーバー証明書で通信相手を確認。
    2. 鍵交換でセッション鍵を作る。
    3. 以後のHTTP通信を、セッション鍵とAEADで保護する。
    段階 目的
    証明書の確認接続先が正しいサーバーか確認。
    鍵交換通信ごとのセッション鍵を作る。
    保護された通信暗号化と改ざん検知を行う。
  • TLS 1.3

    TLS 1.3では、古い暗号方式や危険な選択肢が整理され、より単純で安全な構成になった。

    代表的には、一時鍵を使う鍵交換、AEADの利用、不要な古い方式の削除などが重要になる。
    暗号プロトコルでは、個々の暗号アルゴリズムだけでなく、どの順番で何を検証するかが安全性に関わる。

パスワードハッシュ

  • パスワードはそのまま保存しない

    パスワードを保存するときは、平文のまま保存しない。

    パスワードハッシュでは、saltを加え、計算コストを高くすることで、漏えい時の総当たり攻撃を遅くする。
    Argon2、bcrypt、scrypt、PBKDF2などは、この目的で使われる代表的な方式となる。

    保存時はsaltだけでなく、使用したアルゴリズム、反復回数、メモリ量、並列度などの検証に必要なパラメーターも管理する。
    計算能力の向上に合わせてコスト設定を見直し、ログイン成功時などに新しい設定へ更新できる設計にする。

  • 通常のハッシュとの違い

    通常の高速なハッシュ関数は、ファイル検証などでは便利だが、パスワード保存には速すぎる場合がある。

    攻撃者も高速に候補を試せるため、パスワード保存ではあえて計算やメモリを重くする設計が重要になる。

まとめ

  • AESはDESの後継として広く使われる共通鍵ブロック暗号。
  • 暗号化は復号可能な形で内容を隠し、ハッシュ関数は固定長の要約値を作る。HMACやKDFも暗号化とは異なる役割を持つ。
  • 暗号化だけでは改ざんを検知できず、認証タグやMACが必要になる。AEADは暗号化と改ざん検知をまとめて扱う。
  • 鍵は秘密に保つ必要があり、nonceは秘密性より一意性が重要になる場合が多い。
  • HTTPSはHTTPをTLSで保護し、TLSは公開鍵暗号、共通鍵暗号、証明書、鍵交換を組み合わせて通信を守る。

参考文献

この記事を共有
Xで共有 Facebookで共有 LINEで共有



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp