株式会社エスロジカル
株式会社エスロジカル
SSL証明書(DV、OV、EV)、セキュリティ、Web開発、Linux開発、Go言語

HOME > 技術ドキュメント > AES暗号化入門

AES暗号化入門 — 仕組みと openssl コマンドによる実践


AES(Advanced Encryption Standard)は、現在最も広く使われている共通鍵暗号方式です。
TLS/SSL 通信、ディスク暗号化、ファイル保護など、あらゆる場面で暗号化の中核を担っています。
この記事では AES の仕組みから openssl コマンドを使った実践的な暗号化・復号の方法までを解説します。


暗号方式には大きく分けて2種類あります。

方式 代表アルゴリズム 特徴
共通鍵暗号 AES、ChaCha20 暗号化と復号に同じ鍵を使う。処理が高速で大量データに向く。
公開鍵暗号 RSA、ECDSA、ECDH 暗号化(公開鍵)と復号(秘密鍵)を別の鍵で行う。鍵交換・署名に用いる。低速。

TLS(HTTPS)通信では両方を組み合わせています。公開鍵暗号でセッション鍵を安全に共有し、 実際のデータ通信は 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 が主な暗号スイートとして使われています。


AES はブロック暗号(128 ビット単位で処理)のため、長いデータを暗号化するには「モード」が必要です。

モード 正式名称 特徴
CBC Cipher Block Chaining 前のブロックの暗号文を次のブロックの入力に連鎖させる。IV(初期化ベクトル)が必要。改ざん検知には別途 MAC が必要。
GCM Galois/Counter Mode 暗号化と認証(改ざん検知)を同時に行う AEAD 方式。TLS 1.3 で推奨。パディングが不要。
ECB Electronic Codebook 同じ平文ブロックが同じ暗号文になるため安全でない。実用では使わない

新規実装では AES-256-GCM を選ぶのが現在のベストプラクティスです。


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 は安全な方法で管理・共有する必要があります。 鍵を平文でファイルに保存しないよう注意してください。


# 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 暗号化をハードウェアで高速処理できます。ソフトウェアのみの処理と比べ数倍以上高速です。


HTTPS(TLS)通信における AES の役割は次のとおりです。

  1. クライアントとサーバーが TLS ハンドシェイクを行い、公開鍵暗号(ECDH など)でセッション鍵を共有
  2. 共有したセッション鍵を使い、AES-256-GCM などで実際のデータを暗号化して通信
  3. TLS ハンドシェイクの正当性はSSL証明書(サーバー証明書)で検証

つまり、HTTPS 通信の安全性は SSL証明書(認証)と AES(通信暗号化)の両方によって成り立っています。


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 オプション)

AES による通信暗号化の前提として、SSL証明書(サーバー証明書)によるサーバー認証が不可欠です。
証明書がなければ中間者攻撃により暗号鍵のやり取りが盗まれ、暗号化が無効化されます。
エスロジカルではデジサート・サイバートラストの正規取扱代理店として、 RapidSSL 3,960円/1年(税込)〜 で SSL証明書を販売しています。

SSL証明書の購入はこちら / SSL証明書とは? / DV・OV・EV の違い


← 技術ドキュメント一覧へ戻る