AESとは
AES(Advanced Encryption Standard)は、2001年にNIST(米国国立標準技術研究所)によって標準化された対称暗号アルゴリズムです。ベルギーの暗号学者Joan DaemenとVincent Rijmenが開発したRijndaelアルゴリズムがAESとして採用されました。
AESは、それ以前の標準であったDES(Data Encryption Standard)の後継として設計され、128ビット、192ビット、256ビットの3種類の鍵長をサポートします。現代のほとんどの暗号化システム(TLS、ディスク暗号化、VPNなど)でAESが使用されています。
AESの特徴
- ブロック暗号:128ビット(16バイト)のブロック単位でデータを処理
- 対称暗号:暗号化と復号化に同じ鍵を使用
- 高速:ソフトウェア・ハードウェアの両方で効率的に実装可能
- AES-NI:最新CPUはAES専用命令セットを搭載し、高速処理が可能
AIエンジニアとしての実体験
AIエンジニアとして、AESは機密データの暗号化に頻繁に使用します。特に機械学習の学習データや、推論結果に含まれる個人情報を保護する際に重要です。
あるプロジェクトでは、医療データを使用した機械学習モデルを開発しました。データの保存時にはAES-256-GCMで暗号化し、処理時のみ復号化する設計にしました:
from cryptography.fernet import Fernet
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
# AES-256-GCMでの暗号化
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)
nonce = os.urandom(12) # 96ビットのナンス
ciphertext = aesgcm.encrypt(nonce, plaintext, associated_data)
# 復号化
plaintext = aesgcm.decrypt(nonce, ciphertext, associated_data)
OpenSSLコマンドラインでのAES暗号化例:
# ファイルをAES-256-CBCで暗号化
openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.enc -pbkdf2
# 復号化
openssl enc -aes-256-cbc -d -in encrypted.enc -out decrypted.txt -pbkdf2
AESの暗号モード
AESは単体では128ビットのブロックしか処理できないため、長いデータを暗号化するには「暗号モード」が必要です:
| モード | 特徴 | 推奨度 |
|---|---|---|
| GCM | 認証付き暗号化、並列処理可能 | ✅ 推奨 |
| CTR | ストリーム暗号のように動作、並列処理可能 | ✅ 良い |
| CBC | 広く使用されるが、パディング攻撃に注意 | ⚠️ 注意 |
| ECB | 各ブロック独立、パターンが漏洩 | ❌ 非推奨 |
最新動向(2026年)
ハードウェアアクセラレーション
最新のCPU(Intel、AMD、ARM)にはAES-NI命令セットが搭載されており、ソフトウェア実装と比較して10倍以上の高速化が可能です。サーバーのTLS処理やディスク暗号化のパフォーマンスに大きく貢献しています。
ポスト量子暗号への準備
量子コンピュータによる攻撃に対して、AES-256は比較的安全とされています(Groverのアルゴリズムにより実効的な強度がAES-128相当に低下)。しかし、長期的な機密性が必要なデータには、より長い鍵長の使用が推奨されます。
トラブル事例と対策
⚠️ ECBモードの誤用
症状:暗号化されたデータからパターンが読み取れる
対策:ECBモードは絶対に使用せず、GCMまたはCBCモードを使用する。
⚠️ IV/Nonceの再利用
症状:同じIVで異なるデータを暗号化すると、XOR攻撃が可能に
対策:暗号化ごとにランダムなIV/Nonceを生成し、決して再利用しない。
