AES 暗号化 / 復号

AES-128、AES-192、AES-256(FIPS 197)で GCM(認証付き暗号)、CBC、CTR、ECB モードの暗号化・復号を行います。鍵は生の hex または Base64 バイト、または PBKDF2-HMAC-SHA256 でパスワードから導出。GCM は AAD に対応し、認証タグを独立して表示します。CBC/CTR/ECB の出力は OpenSSL の enc と互換です。ハッシュはハッシュジェネレーター、鍵付き MAC はHMAC ジェネレーター、レガシー暗号はこのファミリーの Legacy Ciphers ページへ。
完全にローカル実行 — 鍵と平文がタブから出ることはありません。最大 200 MB のファイルに対応。
ここに入力したものはすべてこのタブの中に留まります — しかし「本番の機密情報に安全」とは同じではありません。ブラウザーのメモリ、拡張機能、覗き見によって貼り付けた内容が見られる可能性があります。このページは学習・検証・相互運用に使い、実際の顧客データの取り扱いには使わないでください。
方向: モード: 出力:
GCM = 12 バイトのノンスと 128 ビットの認証タグ付き AES-GCM(AEAD:機密性+完全性)。セキュリティが目的なら既定はこれです。
Hex は空白、コロン、0x 接頭辞を許容します。
GCM や CTR で同じ鍵の下でノンスを再利用してはいけません。
タグ長:
パラメーターの行には鍵の読み方、IV、AAD サイズ、タグが正確に記録されるため、コピーした結果は別のマシンでも必ず再現できます。
どのモードを選ぶべき?
GCM が既定の答えです:暗号化と認証を行い — タグの行によって改ざんが検出可能になります(タグの 1 バイトを反転して復号を試すとページは拒否します)。CBC はブロックパターンを隠しますが完全性は提供しません。使うなら HMAC と組み合わせてください(HMAC ジェネレーター参照)。CTR は AES をストリーム暗号に変えます — パディングなし。ただし同じ鍵でノンスを再利用すると CTR でも GCM でも破滅的です。ECB は互換性と教育のためだけに存在します:同一の平文ブロックは同一の暗文ブロックになります(有名な ECB ペンギン)。
OpenSSL 相互運用 — このページの CBC と CTR の出力(PKCS#7 パディング、生鍵)は openssl enc コマンドラインと往復できます:
openssl enc -aes-256-cbc -K <64-hex-鍵> -iv <32-hex-IV> -in msg.txt -out msg.enc
openssl enc -d -aes-256-cbc -K <鍵> -iv <IV> -in msg.enc -out msg.txt
-aes-128-cbc、-aes-192-cbc、-aes-256-ctr(16 バイト IV = 初期カウンターブロック)でも同様です。openssl enc は GCM をサポートしないことに注意 — 認証付き暗号にはこのページ、または OpenSSL 3.3+ の openssl aesgcm を使用してください。
中国の国家暗号が必要ですか?
SM4(GB/T 32907-2016)— 中国の商用暗号で義務付けられているブロック暗号で、AES と同じ 128 ビットのブロックと鍵長を持ちながら独自の鍵スケジュールと S ボックスを持ちます — は ECB と CBC モードで専用ページで動作します:SM4 暗号化 / 復号。SM スイートの残りもそこにあります:SM3 ハッシュ生成(ハッシュ)、 SM2 暗号化 / 復号 / 署名(公開鍵)、 SM9 ID ベース暗号(ID ベース暗号)。
セルフテスト
独立したアンカーに対してページのエンジンを実行します:4 モードすべての既知回答ベクトル(独立したネイティブ実装で生成)、AAD あり/なしの GCM タグベクトル、WebCrypto エンジンと純 JS AES エンジンの相互チェック、GCM ラウンドトリップ、そして陰性テスト(改ざんされたタグ、間違った鍵は失敗しなければならない)。どこにも送信されません。
AES 暗号化をゼロから解説
一言で言えば:AES は世界標準のブロック暗号です — 128、192、256 ビットの鍵の下で 16 バイトのブロックを攪拌します — そしてどのモードで動かすか(GCM、CBC、CTR、ECB)が、ブロックの連鎖方法、IV の役割、改ざんの検出可否を決めます。理由がなければ GCM を選んでください。
AES 自体とは(FIPS 197)

ブロック暗号。AES(Rijndael 設計、2001 年に NIST が FIPS 197 として標準化)は正確に一度に 16 バイトを暗号化します。鍵長 — 16、24、32 バイト — が AES-128、-192、-256 と内部ラウンド数(10、12、14)を選びます。各ラウンドは、鍵から導出されたラウンド鍵で、置換表、行シフト、列混合を使ってブロックを混ぜます。暗号自体を破る実用的な攻撃はありません:現実の失敗はほとんど常にモード、IV、鍵管理のミスで、このページの残りの部分はその話です。

なぜモードが必要?メッセージが 16 バイトであることはめったにないからです。モードはブロック暗号化を接着します:ECB はブロックを独立に暗号化するだけ。CBC は各ブロックを前の暗文と XOR します。CTR はカウンターを暗号化してデータと XOR するストリーム暗号のように振る舞い、GCM は CTR を基に認証タグを加えます。AES は同じ — モードがあなたが得る保証のすべてを変えます。

鍵とパスワード。AES の鍵は 16、24、32 バイトのランダムなバイト列です。人間のパスワードはそうではありません:このページのパスワードオプションは PBKDF2-HMAC-SHA256 で適切な鍵を導出します(既定 600,000 反復、OWASP 2023 の基準 — KDF の詳細はHMAC ジェネレーター参照)。パスワード文字列をそのまま AES の鍵に使ってはいけません:エントロピーは長さのわずかな一部です。

4 つのモードの比較
モードIV / ノンス完全性備考
GCM12 バイト、メッセージごとに一意あり — 96..128 ビットタグAEAD:あらゆる場所で推奨される既定(TLS 1.3、SSH、ファイル形式)。AAD も受け付けます。
CBC16 バイト、予測不可能なしPKCS#7 パディング。古典的だが MAC が別途必要。パディングオラクルのバグは CBC の古典的な落とし穴です。
CTR16 バイトの初期カウンターなしパディングなし、ストリーム的、ランダムアクセス可。1 つの鍵でノンスを再利用すると平文 XOR 平文が漏れます。
ECBなしなし同一ブロック → 同一暗文。ECB ペンギンの実演。互換性専用です。

IV の規則を 1 段落で。IV は秘密ではありません — 暗文の隣に送ります — ただし一意性の規則が異なります:CBC は予測不可能な IV を要求します。GCM と CTR は同じ鍵で同じノンスを決して再利用しないことだけを要求します(GCM のノンス再利用はさらに悪く、認証鍵が漏れます)。このページのランダム IV ボタンはブラウザーのセキュア RNG を使います。全ゼロボタンはテストベクトルの再現のためのもので、実際のメッセージ用ではありません。

パディング。CBC と ECB はブロック全体を必要とするため、PKCS#7 パディングはパッド長に等しい 1..16 バイトを追加します。CBC の暗文が最大 16 バイト伸びる理由であり、間違った鍵で復号するとパディングエラーで失敗する理由です。CTR と GCM はストリーム的でパディング不要 — 暗文の長さは平文と正確に等しくなります(CTR モードでサンプルを試してください:43 バイト入れて 43 バイト出ます)。

CFB と OFB(残りの 2 つの古典モード)はこのページでは実装していません:CTR のようにストリーム的ですが CTR に対する利点がなく、主に古いプロトコルに生き残っています。

GCM が加えるもの(AEAD、タグ、AAD)

認証付き暗号。GCM = CTR 暗号化 + 暗文、IV、AAD にわたる GHASH 認証子。出力タグはすべてのフィンガープリントです:暗文、IV、AAD の 1 ビットを変えるとタグは一致しなくなり、受信者はメッセージが無傷で鍵の保持者から来たことを証明できます。CBC+HMAC は正しく構成した場合(encrypt-then-MAC)にのみ同等を達成します — GCM は構造として正しく行います。

AAD。追加認証データは平文のまま運ばれますがタグの保護下にあります:プロトコルヘッダー、ファイル名、アルゴリズム識別子。受信者は同一の AAD バイトを渡さなければタグチェックが失敗します — それが目的です。

タグ長。既定の 128 ビットタグが推奨です。短いタグ(96..120 ビット)は偽造耐性とサイズを交換します。96 ビット未満では GCM のセキュリティ証明が急速に劣化するため、このページはそこで止めています。

ノンスの破滅。同じ鍵の下で 12 バイトの GCM ノンスを再利用すると、2 つのメッセージの平文 XORと認証サブキーが漏れます — その後、その鍵の下の将来のすべてのメッセージで偽造が可能になります。一意性を保証できないシステムはノンス誤用耐性のある変種(AES-GCM-SIV、RFC 8452)を使います。

アンカー値 — このページで再現できます

最初の行は有名な単一ブロックの FIPS 197 の例です。残りは独立したネイティブ実装(Node.js 経由の OpenSSL)で生成され、このページのエンジンで再検証されました。鍵、IV、入力をページに貼り付けると各行を再現できます。

ケース入力期待される出力
AES-128 単一ブロック(FIPS 197 形式)key 000102..0f, plaintext 00112233..ff69c4e0d86a7b0430d8cdb78070b4c55a
AES-128-GCMkey 000102..0f, IV 606162..6b, plaintext 0011..ef ×2ct 275f095bedfda377063fee326128892188377b410698ed03a022b9971bb4bdbe, tag 87ea7770714048977de2fd8dac645ecf
AES-256-GCM、同じだが AAD deadbeefkey 000102..1fct eacab966ff15e518f48f5390be502fbc2756ccee0dcfff36a282c50bf5593ae7, tag aead900e895c88252d0388d7aefce5c8
AES-256-CBCkey 000102..1f, IV 101112..1f, plaintext 0011..ef ×20e2392dd6f690b44a5a1b4fdff3b7f83cb9ab59d9900119cc5f83e062d95fb643b1a94b514ea2f3b95f84c900b5c98a8
AES-256-CTR(上の CBC と同じ入力)43-byte plaintext → 43-byte ciphertexte9d2cdb9f661359178ed366dfa3a4671f8e20efd723f090eb7d1d524d480fd3c
よくある間違い
  • IV が不要だからと ECB を使う。便利さこそが罠です:ブロックパターンがそのまま暗文に漏れます(ビットマップを暗号化しても絵が見える)。ECB が許されるのは単一ブロックかちょうど 16 バイトのランダム鍵だけ — 実務では選んで使うことは決してありません。
  • ノンス/IV を再利用する。1 つの鍵の下の GCM や CTR では、一度にすべてを壊す唯一の間違いです。カウンターベースのシステム(このページのランダム IV ボタン)はそれを不可能にするために存在します。
  • IV を秘密として扱う。秘密ではありません。暗文の隣に保存または送信します。隠しても何も得られず、再利用を誘発するだけです。
  • パスワードを鍵として使う。"hunter2hunter2hunter2hunter2" は 32 バイトですが 256 ビットのエントロピーではありません — パディング付きの辞書語です。PBKDF2(このページに内蔵)で導出するか、ランダム鍵を生成してください。
  • CBC が改ざんを検出すると仮定する。CBC の暗文の 1 ビットを反転すると、復号は黙って破損した平文で「成功」します。改ざんを見えるようにするのは GCM のタグ(または明示的な HMAC)だけです。
  • GCM の暗文を等しいか比較する。ランダムノンスでは同じ平文も毎回違うように暗号化されます — それが機能です。決定論的な暗号化は別の、特殊なツールです。
よくある質問

AES-128 はまだ安全ですか、256 が必要ですか?どちらも現実的な攻撃者に対して安全です。知られている最良の攻撃でもマージンのわずかな部分しか削りません。AES-256 が主に重要なのは長期の秘密とポスト量子の安心材料です(Grover のアルゴリズムは鍵強度を半減させ、AES-256 を約 128 ビット相当に残します)。

なぜ openssl enc は GCM をやらないのですか?enc コマンドは AEAD より古く、タグを運ぶ方法がありません。OpenSSL 3.3 が代わりに専用の aesgcm コマンドを追加しました。このページの GCM 出力はタグを独立した行に保持するため、両方を明示的に運べます。

鍵ラッピング(AES-KW)とは?他の鍵を固定 64 ビットのチャンクで暗号化する特殊なモードで、独自の完全性チェックを持ちます。入出力がメッセージ形ではなく鍵形のため、誤用が常態になり、ここでは提供していません。

CTR の暗文が平文と同じ長さなのに CBC は長くなるのはなぜ?CTR と GCM はストリーム的(パディングなし)。CBC/ECB は PKCS#7 で 16 バイトのブロック全体にパディングします。長さの違いは仕様でありバグではありません。

他の場所で暗号化されたものを復号できますか?はい。正確なモード、鍵、IV(GCM ならタグ)が分かれば可能です。このページの出力行はすべてを正確に記録するため、ツール間でパラメーターを持ち運べます — 上の OpenSSL ボックスに対応するコマンドラインがあります。