AES暗号化入門 — 仕組みと openssl コマンドによる実践
AES(Advanced Encryption Standard)は、現在最も広く使われている共通鍵暗号方式です。
TLS/SSL 通信、ディスク暗号化、ファイル保護など、あらゆる場面で暗号化の中核を担っています。
この記事では AES の仕組みから openssl コマンドを使った実践的な暗号化・復号の方法までを解説します。
1. 共通鍵暗号と公開鍵暗号の違い
暗号方式には大きく分けて2種類あります。
| 方式 | 代表アルゴリズム | 特徴 |
|---|---|---|
| 共通鍵暗号 | AES、ChaCha20 | 暗号化と復号に同じ鍵を使う。処理が高速で大量データに向く。 |
| 公開鍵暗号 | RSA、ECDSA、ECDH | 暗号化(公開鍵)と復号(秘密鍵)を別の鍵で行う。鍵交換・署名に用いる。低速。 |
TLS(HTTPS)通信では両方を組み合わせています。公開鍵暗号でセッション鍵を安全に共有し、 実際のデータ通信は AES などの共通鍵暗号で高速に暗号化します。
2. AES の鍵長とセキュリティ強度
AES は鍵の長さが 128・192・256 ビットの3種類あります。
| 鍵長 | ラウンド数 | 用途・備考 |
|---|---|---|
| AES-128 | 10 | 現時点で十分安全。一般的な用途に広く使われる。 |
| AES-192 | 12 | 128 と 256 の中間。あまり使われない。 |
| AES-256 | 14 | 最高強度。TLS 1.3・政府・金融など高セキュリティ要件で標準。 |
TLS 1.3 では AES-128-GCM または AES-256-GCM が主な暗号スイートとして使われています。
3. 暗号モード(CBC vs GCM)
AES はブロック暗号(128 ビット単位で処理)のため、長いデータを暗号化するには「モード」が必要です。
| モード | 正式名称 | 特徴 |
|---|---|---|
| CBC | Cipher Block Chaining | 前のブロックの暗号文を次のブロックの入力に連鎖させる。IV(初期化ベクトル)が必要。改ざん検知には別途 MAC が必要。 |
| GCM | Galois/Counter Mode | 暗号化と認証(改ざん検知)を同時に行う AEAD 方式。TLS 1.3 で推奨。パディングが不要。 |
| ECB | Electronic Codebook | 同じ平文ブロックが同じ暗号文になるため安全でない。実用では使わない。 |
新規実装では AES-256-GCM を選ぶのが現在のベストプラクティスです。
4. openssl コマンドで AES 暗号化・復号
Linux や macOS 標準の openssl コマンドで AES 暗号化を試せます。
ファイルの暗号化
# AES-256-CBC でファイルを暗号化(パスワード入力を求められる) openssl enc -aes-256-cbc -pbkdf2 -in plaintext.txt -out encrypted.bin # 暗号化ファイルを復号 openssl enc -aes-256-cbc -pbkdf2 -d -in encrypted.bin -out decrypted.txt
AES-256-GCM での暗号化(OpenSSL 1.1.1+)
# AES-256-GCM で暗号化 openssl enc -aes-256-gcm -pbkdf2 -in plaintext.txt -out encrypted_gcm.bin # 復号 openssl enc -aes-256-gcm -pbkdf2 -d -in encrypted_gcm.bin -out decrypted.txt
鍵とIVを直接指定する場合
# 256 ビット(64 hex 文字)の鍵と 128 ビット(32 hex 文字)の IV を生成 KEY=$(openssl rand -hex 32) IV=$(openssl rand -hex 16) echo "KEY=$KEY" echo "IV=$IV" # 暗号化 openssl enc -aes-256-cbc -K $KEY -iv $IV -in plaintext.txt -out encrypted.bin # 復号(同じ KEY と IV を使う) openssl enc -aes-256-cbc -d -K $KEY -iv $IV -in encrypted.bin -out decrypted.txt
注意: 鍵と IV は安全な方法で管理・共有する必要があります。 鍵を平文でファイルに保存しないよう注意してください。
5. openssl で AES 処理速度を確認する
# AES-128/192/256 の処理速度ベンチマーク openssl speed aes-128-cbc aes-256-cbc aes-256-gcm # 例: AES-256-GCM で数 GB/s の処理速度(AES-NI 対応 CPU の場合)
Intel/AMD の現代的な CPU は AES-NI 命令セットを搭載しており、 AES 暗号化をハードウェアで高速処理できます。ソフトウェアのみの処理と比べ数倍以上高速です。
6. TLS/SSL と AES の関係
HTTPS(TLS)通信における AES の役割は次のとおりです。
- クライアントとサーバーが TLS ハンドシェイクを行い、公開鍵暗号(ECDH など)でセッション鍵を共有
- 共有したセッション鍵を使い、AES-256-GCM などで実際のデータを暗号化して通信
- TLS ハンドシェイクの正当性はSSL証明書(サーバー証明書)で検証
つまり、HTTPS 通信の安全性は SSL証明書(認証)と AES(通信暗号化)の両方によって成り立っています。
7. Go 言語での AES-GCM 暗号化
Go 標準ライブラリで AES-256-GCM 暗号化を実装する例です。
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"fmt"
"io"
)
func encrypt(plaintext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
return nil, err
}
// nonce を先頭に付加して返す
return gcm.Seal(nonce, nonce, plaintext, nil), nil
}
func decrypt(ciphertext, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
gcm, err := cipher.NewGCM(block)
if err != nil {
return nil, err
}
nonceSize := gcm.NonceSize()
nonce, ciphertext := ciphertext[:nonceSize], ciphertext[nonceSize:]
return gcm.Open(nil, nonce, ciphertext, nil)
}
func main() {
key := make([]byte, 32) // AES-256
rand.Read(key)
encrypted, _ := encrypt([]byte("Hello, AES-GCM!"), key)
decrypted, _ := decrypt(encrypted, key)
fmt.Println(string(decrypted)) // Hello, AES-GCM!
}
まとめ
| 項目 | 推奨 |
|---|---|
| アルゴリズム | AES-256 |
| モード | GCM(認証付き暗号。AEAD) |
| Nonce/IV | 毎回ランダム生成(crypto/rand を使う) |
| 鍵管理 | 環境変数・KMS・HSM などで安全に管理 |
| パスワードからの鍵導出 | PBKDF2・scrypt・Argon2 を使用(openssl の -pbkdf2 オプション) |
SSL証明書とサーバーのセキュリティ
AES による通信暗号化の前提として、SSL証明書(サーバー証明書)によるサーバー認証が不可欠です。
証明書がなければ中間者攻撃により暗号鍵のやり取りが盗まれ、暗号化が無効化されます。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、
RapidSSL 3,960円/1年(税込)〜 で SSL証明書を販売しています。
SSL証明書の購入はこちら / SSL証明書とは? / DV・OV・EV の違い
