SIGMA-SE Tech Blog

SIGMA-SE Tech Blog


当サイトは、過去に運営していた別ドメイン(unisia-se.com)から sigma-se.com へ移行した技術ブログです。
旧サイトの記事をもとに、内容の精査・加筆・最新化を行い再構成しています。
正確で実用的な情報提供を目的としています。

情報セキュリティ - 暗号技術:7/10 共通鍵暗号とDESの仕組み

概要

コンピュータで情報を守るために整備された暗号理論と、DESにつながる共通鍵暗号について説明する。

共通鍵暗号は、暗号化と復号で同じ鍵を使う方式であり、大量データを高速に守るための基本になる。
1940年代後半から1970年代にかけて、シャノンの理論、Feistel構造、DESの標準化によって、現代的なブロック暗号の考え方が形になった。

この記事で扱うこと

  • シャノンの暗号理論が現代暗号の土台になった理由。
  • 共通鍵暗号で、同じ鍵を暗号化と復号に使う考え方。
  • ブロック暗号とストリーム暗号の違い。
  • Feistel構造が復号しやすい暗号構造として重要になった理由。
  • DESと3DESが、後のAESにつながる理由。

共通鍵暗号を支える理論

  • シャノンの暗号理論

    1940年代後半になると、暗号は経験的な技術だけではなく、数学的に分析される対象になった。

    特にクロード・シャノンは、暗号の安全性を情報理論の観点から整理した。
    「暗号文を見ても平文について何も分からない」という理想的な安全性は、後に完全秘匿性として理解される。

  • 完全秘匿性とワンタイムパッド

    完全秘匿性を満たす代表例は、十分にランダムな鍵を平文と同じ長さだけ用意し、一度だけ使うワンタイムパッドとなる。

    ただし、現実には平文と同じ長さの完全ランダムな鍵を安全に配布し、再利用しないように管理することが難しい。
    そのため、実用暗号では「解読に現実的でない計算量が必要」という意味で安全性を考えるようになる。

共通鍵暗号の基本

  • 同じ鍵を使う暗号方式

    共通鍵暗号とは、暗号化と復号に同じ鍵を使う暗号方式となる。

    送信者と受信者が同じ鍵を事前に共有しておき、送信者はその鍵で平文を暗号文へ変換する。
    受信者は同じ鍵を使って暗号文を平文へ戻す。

    \[ {\small C = E_{K}(P), \quad P = D_{K}(C) } \]
  • 鍵配布の問題

    共通鍵暗号は高速で実用的だが、通信相手ごとに鍵を安全に渡す必要がある。

    例えば、10人が全員と安全に通信したい場合、相手ごとに別の鍵を持つ必要がある。
    利用者が増えるほど、鍵の配布、保管、更新が難しくなる。

    この課題は、後の公開鍵暗号が登場する大きな理由となった。

ブロック暗号とストリーム暗号

  • ブロック暗号

    ブロック暗号は、平文を固定長のブロックに分け、ブロックごとに暗号化する方式となる。

    例えば、現在広く使われるAESでは、128ビットのブロックを基本単位として扱う。
    ブロック暗号では、同じ鍵でも利用モードや初期値によって、同じ平文ブロックが同じ暗号文にならないように工夫する。

  • ストリーム暗号

    ストリーム暗号は、鍵から疑似乱数の列である鍵ストリームを作り、平文と逐次組み合わせる方式となる。

    考え方はワンタイムパッドに近いが、完全ランダムな使い捨て鍵ではなく、鍵から生成した鍵ストリームを使う。
    そのため、同じ鍵や同じ初期値を再利用しないことが非常に重要になる。

    ブロック暗号とストリーム暗号は、次のように整理すると違いが見えやすい。

    方式 処理単位 考え方 注意点
    ブロック暗号固定長のブロック平文をかたまりに分けて変換する。利用モードや初期値の扱いが重要になる。
    ストリーム暗号ビット列やバイト列鍵ストリームと平文を逐次組み合わせる。同じ鍵ストリームを再利用しない。

Feistel構造で理解するDES

  • Feistel構造

    Feistel構造は、平文ブロックを左右に分け、片方を関数に通してもう片方と組み合わせ、左右を入れ替える構造となる。

    この構造の重要な点は、暗号化と復号で同じような処理を使えることにある。
    復号では、ラウンド鍵を逆順に使うことで元の平文へ戻せる。

    1ラウンドだけを見ると、処理は次のように進む。

    1. 平文ブロックを左半分 \(L_0\) と右半分 \(R_0\) に分ける。
    2. 右半分 \(R_0\) とラウンド鍵 \(K_1\) を関数 \(F\) に入れる。
    3. 左半分 \(L_0\) と \(F(R_0, K_1)\) をXORする。
    4. 左右を入れ替え、次のラウンドへ進む。
    次の値 作り方
    \(L_1\)\(R_0\)
    \(R_1\)\(L_0 \oplus F(R_0, K_1)\)
  • DESの標準化

    DES(Data Encryption Standard)は、1970年代に標準化された代表的な共通鍵ブロック暗号となる。

    DESは64ビットブロックを扱い、56ビットの鍵を使う。
    当時は実用的な暗号標準として広く使われたが、計算機性能の向上によって、56ビット鍵は総当たり攻撃に耐えにくくなった。

DESから3DESへ

  • DESの限界

    DESの弱点は、暗号の考え方そのものよりも、鍵長が短くなったことにある。

    コンピュータの性能が上がると、可能な鍵を順番に試す攻撃が現実味を持つ。
    そのため、DESをそのまま使い続けることは難しくなった。

  • 3DES

    3DES は、DESを複数回適用することで安全性を高めようとした方式となる。

    既存のDES実装との互換性を保ちながら安全性を延ばす目的があった。
    しかし処理が重く、ブロックサイズも古いため、現在ではAESのような新しい標準へ移行するのが基本となる。

違いを整理する

比較する項目 整理するポイント
完全秘匿性と実用暗号完全秘匿性は理論的な理想、実用暗号は計算量で安全性を考える。
共通鍵暗号と公開鍵暗号共通鍵暗号は同じ鍵を共有する方式、公開鍵暗号は鍵を分ける方式。
ブロック暗号とストリーム暗号固定長のかたまりを変換するか、鍵ストリームと逐次組み合わせるかで異なる。
暗号方式と運用方式が強くても、鍵の配布や更新が弱いと安全性は下がる。

実務とのつながり

  • 共通鍵暗号
    TLS、VPN、ファイル暗号化など、多くの実用システムでは本文の暗号化に共通鍵暗号を使う。
  • 鍵管理
    暗号方式の強さだけでなく、鍵の生成、保管、更新、廃棄の管理が重要になる。
  • 標準の更新
    DESからAESへ移行したように、暗号は一度決めた方式を永久に使うものではなく、計算能力や攻撃手法に合わせて更新する必要がある。

まとめ

  • 暗号理論は、経験的な秘匿技術を数学的に分析する土台となった。
  • 共通鍵暗号は高速で実用的だが、鍵を安全に共有する必要がある。
  • Feistel構造とDESは、現代的なブロック暗号の発展に大きな役割を持った。
  • DESの鍵長は時代とともに不足し、後のAES標準化へつながった。

参考文献

  • National Institute of Standards and Technology, FIPS 197, Advanced Encryption Standard(AES)


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