SS-Infra ← ポータルに戻る

暗号学

1. 暗号学の概要と目的

暗号学(Cryptology)は、情報を第三者に読み取られない形に変換する技術と、その安全性を数学的に評価する手法を扱う学問分野です。

Webサイトの通信がHTTPSで保護されていること、パスワードがそのまま保存されていないこと、ソフトウェアの更新ファイルが改ざんされていないと確認できること。これらはすべて暗号学の成果の上に成り立っています。

この章では、暗号学がどのようなものなのか、また、なぜ知っておく必要があるのかを確認します。

暗号学とは?

暗号学とは、情報を保護するための技術体系と、その強度を評価する理論を扱う分野です。大きく、安全な方式を設計する「暗号作成(Cryptography)」と、その方式を破る手法を研究する「暗号解読(Cryptanalysis)」の二つに分かれます。

暗号学が守ろうとする性質は、主に次の4つです。

例えば、「暗号化されているから安全」という表現がよく使われますが、これは機密性だけを指しています。

暗号化のみ:内容は読めないが、改ざんされても気づけない

一方、現在の実装では次のように、複数の性質を同時に満たす方式が用いられます。

認証付き暗号(AEAD):内容を読めないうえに、改ざんがあれば検知できる

このように、「何を守りたいのか」を定めて適切な方式を選ぶ点が暗号学の実践における要点です。

なお、暗号学の安全性は「アルゴリズムを秘密にすること」ではなく「鍵を秘密にすること」に依存させるべきである、という原則があります。これをケルクホフスの原理と呼びます。広く公開され、長年にわたり多くの研究者の攻撃に耐えた方式こそが信頼できる、という考え方です。

暗号学はどのような場面で登場するのか?

暗号学は、学問としてだけでなく、日常的なシステム開発や運用のあらゆる場面で実装として登場します。

例えば、次のような場面が代表的な利用例です。

Web開発者やインフラ担当者にとって、暗号学はアルゴリズムを自ら実装するためではなく、「既存の方式を正しく選び、正しく使う」ために必要な知識です。

2. 暗号学の仕組み・規格・主な特徴

暗号学の実装は、いくつかの基本部品(プリミティブ)を組み合わせて構成されます。

部品にはそれぞれ役割が決まっており、組み合わせ方を誤ると、個々の部品が安全でも全体としては破られてしまいます。

ここでは、代表的な方式の違いや、実際の構成例を確認します。

共通鍵暗号と公開鍵暗号の違いと特徴

暗号方式は、鍵の扱い方によって大きく2種類に分けられます。

公開鍵を用いる方式は、担う役割によって次の3種類に分かれます。混同されやすい部分なので、整理しておくと理解しやすくなります。

楕円曲線暗号のうち ECDSA と Ed25519 は署名用、X25519 は鍵交換用であり、データそのものを暗号化する機能は持ちません。「公開鍵暗号」という言葉は、これら全体を指す場合と、狭く暗号化方式だけを指す場合があります。

実際のシステムでは、共通鍵暗号と公開鍵を用いる方式を組み合わせたハイブリッド構成が使われます。TLS 1.3であれば、鍵交換(X25519 などのECDHE)で共通鍵の素となる値を共有し、サーバー証明書の電子署名で接続先の正当性を確認したうえで、以降の通信を高速な共通鍵暗号で保護します。かつて使われていた「公開鍵暗号で共通鍵そのものを暗号化して送る」方式(RSA鍵転送)は、TLS 1.3で廃止されました。

このほか、暗号学には次のような基本部品があります。

処理の流れを、HTTPS通信を例に追うと次のようになります。

  1. ブラウザとサーバーが、利用する暗号方式(暗号スイート)を決める。
  2. 鍵交換の方式(ECDHE など)によって、共通鍵の素となる値を安全に共有する。
  3. サーバー証明書の電子署名を検証し、接続先が正当であることを確認する。
  4. 共有した値から共通鍵を導出し、以降のデータを認証付き暗号で保護する。

この流れのどこかで古い方式が使われていると、全体の安全性がその部分に引きずられます。

暗号方式の選択と記述

実務では、アルゴリズムを実装するのではなく、ライブラリが提供する方式を適切に選択します。

例えば、次のような記述になります。

【記述・構造の具体例】

用途ごとに適切な方式を選択する例です。

# データの暗号化:認証付き暗号(AES-GCM)を使用する
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

key = AESGCM.generate_key(bit_length=256)
nonce = os.urandom(12)              # 毎回新しい値を生成する
ct = AESGCM(key).encrypt(nonce, b"secret data", None)
# パスワードの保管:専用のパスワードハッシュ関数を使用する
from argon2 import PasswordHasher

ph = PasswordHasher()
stored = ph.hash("user-password")   # 保存するのはこの値
ph.verify(stored, "user-password")  # 照合はライブラリの関数で行う
# データの同一性確認:ハッシュ関数を使用する
import hashlib

digest = hashlib.sha256(b"file contents").hexdigest()

このように、「内容を秘匿したいのか」「本人のパスワードか確認したいのか」「同じデータか確認したいのか」という目的に応じて、使う部品が変わります。

なお、日本国内では、CRYPTRECが公開する暗号リストが方式選択の参考になります。安全性と実装実績が評価された方式が整理されており、政府調達の基準にもなっています。

3. 暗号学が使われる理由・メリットと活用シーン

暗号学が必要とされる理由は、インターネットが「通信経路を信頼できない」前提で成り立っているからです。

経路上の第三者がデータを覗いたり書き換えたりできる環境でも、暗号技術があれば内容の秘匿と改ざんの検知が可能になります。

暗号技術を使うメリット

暗号技術を用いない場合、通信経路やサーバーに侵入された時点で、情報はそのまま読み取られてしまいます。

適切な暗号技術を使用することで、次のようなメリットが生まれます。

ただし、暗号技術は「使えば安全になる」ものではありません。鍵が漏れれば保護は無効になり、古い方式を使っていれば破られます。運用とセットで初めて効果を持ちます。

Web開発やシステム運用で活用する

実際の開発・運用では、以下のような場面で活用されます。

このように、データが「動くとき」と「保存されているとき」の両方で保護が必要になります。

暗号設定の確認方法

自分のサーバーやアプリケーションがどの方式を使っているかは、コマンドで確認できます。

# TLSの接続状況と、合意された暗号スイートを確認する
openssl s_client -connect example.com:443 -brief

# 証明書の署名アルゴリズムと鍵の長さを確認する
openssl s_client -connect example.com:443 2>/dev/null \
  | openssl x509 -noout -text | grep -E "Signature Algorithm|Public-Key"

# 対応している暗号スイートを一覧で調べる
nmap --script ssl-enum-ciphers -p 443 example.com

確認すべきは、TLS 1.2以上が使われていること、SHA-1 による署名や短い鍵長が残っていないこと、そして古い方式(RC4・3DES・TLS 1.0/1.1)が無効化されていることです。

アプリケーション側のコードについては、md5・sha1・ECB・PBKDF2 の反復回数といったキーワードをプロジェクト全体から検索し、古い方式が残っていないか点検するとよいでしょう。

関連技術・関連用語との違い

暗号学と混同されやすい関連用語として、次のようなものがあります。

暗号学が「鍵を知らなければ現実的な時間で破れない」ことを数学的な根拠に基づいて示すのに対し、難読化やエンコードにはその根拠がありません。

「見た目が読めない」ことと「暗号学的に保護されている」ことは別の概念として区別する必要があります。

4. 暗号学の導入・運用時の注意点と課題

暗号技術は、方式そのものが破られるケースよりも、使い方を誤って破られるケースが圧倒的に多いという特徴があります。

正しいアルゴリズムを選んでいても、組み合わせ方や鍵の扱いを誤れば保護は成立しません。

ここでは、実務上注意すべきポイントを説明します。

よくあるミス・設定ミス

最も重大な問題の一つが、独自の暗号方式やプロトコルを自分で設計・実装してしまうことです。

暗号方式の安全性は、公開され、長期間にわたって多くの専門家の攻撃に耐えることで初めて確かめられます。社内で考案した方式は、その検証を一切受けていません。暗号の実装は、実績のあるライブラリに委ねるのが原則です。

また、次のようなミスも頻出します。

運用・セキュリティ上の注意点

暗号モードの選択を誤ると、暗号化しているにもかかわらず内容が推測できてしまいます。

【よくある失敗・注意点の例】

ブロック暗号のモードに ECB を選んでしまっている例です。

危険な実装

# ECBモードは同じ平文ブロックが同じ暗号文ブロックになる
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

cipher = Cipher(algorithms.AES(key), modes.ECB())

安全な実装

# 認証付き暗号(GCM)を使い、ノンスは毎回生成する
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os

nonce = os.urandom(12)
ct = AESGCM(key).encrypt(nonce, plaintext, None)

この例では、ECB モードが平文のブロックごとに独立して暗号化を行うため、同じ内容のブロックが常に同じ暗号文になります。画像を暗号化すると元の輪郭が判別できてしまうことが古くから知られており、データベースの列を暗号化した場合も、同じ値を持つ行を特定できてしまいます。

さらに、ECB や CBC には改ざんを検知する仕組みがありません。認証機能を持つ GCM などの認証付き暗号(AEAD)を選ぶことで、秘匿と改ざん検知を同時に満たせます。

そのほか、運用面では次の点にも注意が必要です。

安全に利用するための対策

暗号技術を適切に運用するためには、以下の対策が有効です。

特に、暗号技術は「導入して終わり」にできない分野です。方式の安全性が時間とともに低下することを前提に、見直しの仕組みを運用へ組み込んでおくことが重要です。

5. まとめと関連ツールのご案内

ここまで解説した暗号学について、重要なポイントを振り返ります。

【お役立ちツールのご案内】

ここまで解説した暗号技術の基盤となる「推測できない値」を、実際に手元で生成したい場合は、当サイトの セキュアパスワード生成ツール をぜひご活用ください。

暗号論的に安全な乱数をもとに、文字種や長さを指定してパスワードを生成できます。各種アカウントのパスワードや、暗号化ファイルのパスフレーズを用意する際にお役立てください。