AES復号ツール — OpenSSL・CryptoJS互換
AESをオンラインで復号 — GCM/CBC/CTR、パスフレーズまたは生鍵に対応し、OpenSSLとCryptoJSの「U2FsdGVkX1」形式を自動検出します。処理は100%ブラウザ内で完結し、鍵がこのページから出ることはありません。
詳細オプション
同じ鍵でIVを再利用しないでください。空欄のままにすると安全なランダムIVが生成されます。
AES復号の仕組み
AESの復号は暗号化の正確な逆操作です — データを攪拌したのと同じ対称鍵を使って、暗号のラウンドを逆順に実行し、元のバイト列を復元します。AESは対称暗号であるため、別個の「復号鍵」は存在しません — 暗号化に使われたのとまったく同じ鍵またはパスフレーズ、モード、IVを指定する必要があります。パラメータが正しければ平文はバイト単位で正確に復元されますが、1つでも間違えるとエラーかガベージになります。
正しく復号するには、次の4つが暗号化時と完全に一致していなければなりません — 鍵(またはパスフレーズとその鍵導出設定)、動作モード(GCM、CBC、またはCTR)、IVまたはノンス、そしてGCMの場合は認証タグです。いずれかが欠けていると、結果はハードエラー(GCMの認証失敗、CBCのパディング失敗)か、無言のガベージ(CTR、または誤ったIVでのCBC)になります。このツールは、ソルト、IV、タグが暗号文に内包されている場合はそれらを読み取り、何かが一致しないときはその失敗の原因を診断します。
暗号文にはいくつかの異なる形があり、このツールは3種類を理解します。フォーマット1は自己完結型のパスフレーズレイアウトです — 16バイトのソルト、続いてIV、続いて暗号文(GCMモードではGCMタグが末尾に付加されます) — パスフレーズだけで復号できます。フォーマット2は生鍵レイアウトです — 暗号文の前にIVが付加されているか、IVを別途入力する「ベア」暗号文です。フォーマット3はOpenSSLレイアウトで、openssl encコマンドやCryptoJSによって生成されます。
このOpenSSL形式は見た目で覚えておく価値があります。8バイトのASCII文字列Salted__で始まり、続いて8バイトのソルト、続いて暗号文が続きます。全体をBase64エンコードすると、先頭のバイトは常にU2FsdGVkX1というプレフィックスとして表示されます。そのため、渡された暗号文がU2FsdGVkX1で始まる場合、それはほぼ確実にopenssl encかCryptoJSのAES.encrypt(text, passphrase)呼び出しによって生成されたものです。CryptoJSはMD5を1回だけ使うレガシーなEVP_BytesToKey関数で鍵を導出する一方、最新のopensslはPBKDF2を使います — これが、これらを復号する際に正しい鍵導出関数を選ぶことがすべてを左右する理由です。入力がBase64で、生のバイト列を見たいだけなら、Base64デコーダーで確認できます。これらの形式で暗号文を作成するには、AES暗号化ツールを使ってください。
// AES-256-GCM decrypt with a passphrase (PBKDF2-HMAC-SHA256, 600,000 iterations).
// Identical code runs in the browser and in Node.js 20+ via Web Crypto.
async function aesGcmDecrypt(base64, passphrase) {
const enc = new TextEncoder();
const packed = Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
const salt = packed.slice(0, 16), iv = packed.slice(16, 28); // salt(16) | iv(12)
const ct = packed.slice(28); // ciphertext + tag
const baseKey = await crypto.subtle.importKey(
'raw', enc.encode(passphrase), 'PBKDF2', false, ['deriveKey']);
const key = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt, iterations: 600000, hash: 'SHA-256' },
baseKey, { name: 'AES-GCM', length: 256 }, false, ['decrypt']);
const plain = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv }, key, ct); // throws if the tag fails
return new TextDecoder().decode(plain); // recovered plaintext
} 主な機能
OpenSSL・CryptoJS出力を自動検出
U2FsdGVkX1で始まる暗号文を貼り付けると、ツールはSalted__形式を認識し、対応する復号フローへワンクリックで切り替えを提案するので、行き詰まったエラーと格闘せずに済みます。
3種類の鍵導出関数
openssl enc形式のあらゆる世代にわたって復号できます — カスタムの反復回数を指定できるPBKDF2、SHA-256を使うEVP_BytesToKey、CryptoJSが使うレガシーなMD5単回パスです。
復号が失敗した理由を説明
一般的なエラーの代わりに診断が得られます — 鍵の誤りとIVの誤りの区別、GCMの認証失敗、CBCのパディングエラー、Base64の汚染、あるいは「これはMD5時代の暗号文のようです。EVP-MD5を試してください」といった具合です。
対応するopensslコマンドをリアルタイム表示
コマンドラインで復号を再現する正確なopenssl enc -dコマンドを、反復回数も含めて確認できるので、ブラウザの外でも結果を検証できます。
パスフレーズまたは生鍵、GCM/CBC/CTR
自己完結型のパスフレーズ暗号文、IVが先頭に付加されたまたは別途入力する生鍵暗号文、そしてWeb Cryptoの3つのモードすべてに対応します。
100%ブラウザ内で完結
暗号文と鍵はWeb Crypto APIを使ってローカルで処理され、アップロードされることはありません — ネットワークタブで確認するか、オフラインにして検証できます。
AES復号の例
自己完結型のパスフレーズ暗号文を復号する(GCM)
salt(16) ‖ iv(12) ‖ ciphertext ‖ tag(16)、Base64 — 暗号化ページから
素早い茶色の狐がのろまな犬を飛び越える。
これは暗号化ページのGCM例の逆操作です。パスフレーズhunter2に対して生成された自己完結型のBase64文字列を、モードGCM、鍵長256、鍵の種類パスフレーズ、同じパスフレーズhunter2とともにここに貼り付けると、元の文が復元されます。ソルトやIVを別途入力する必要はありません — ツールは文字列の先頭にある16バイトのソルトと12バイトのIVを読み取り、PBKDF2-HMAC-SHA256(600,000回反復)で鍵を導出し、付加された128ビットのGCMタグを検証してからテキストを返します。暗号化ページで「サンプルを読み込む」をクリックして新しい文字列を生成し、ここで復号してみてください。
実際のOpenSSL / PBKDF2出力を復号する
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=
Attack at dawn!
これは本物のopenssl enc出力です。これを貼り付け、OpenSSLモード(モードCBC、鍵の種類パスフレーズ)に切り替え、パスフレーズcorrect-horseを入力し、鍵導出関数にPBKDF2を選び、反復回数を10,000に設定すると — 平文はAttack at dawn!になります。U2FsdGVkX1というプレフィックスは、これがSalted__形式であることをツールに伝え、8バイトのソルトはそのヘッダーの直後、Base64の中に収まっています。このコマンドラインでまったく同じ復号を再現できます: echo 'U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ=' | openssl enc -d -aes-256-cbc -pbkdf2 -iter 10000 -pass pass:correct-horse -base64 -A。似たような暗号文がPBKDF2で失敗する場合、それはおそらくCryptoJSで作られたものです — KDFをEVP-MD5に切り替えて再試行してください。「OpenSSLサンプルを読み込む」をクリックすると、これらの値が自動的に入力されます。
AES暗号文を復号する方法
- 1
暗号文を貼り付ける
Base64またはHexの暗号文を入力欄にドロップしてください。U2FsdGVkX1で始まる場合、ツールはOpenSSL/CryptoJS形式として検出し、正しいモードへの切り替えを提案します。
- 2
形式とモードを設定する
このツールで生成された自己完結型の文字列の場合は、パスフレーズモードと一致するGCM/CBC/CTRのままにしてください。OpenSSL/CryptoJSの出力の場合は、提案された切り替え(CBC + パスフレーズ)を受け入れてください。生鍵データの場合は、生鍵とエンコーディングを選び、IVが先頭に付加されていない場合は別途入力してください。
- 3
鍵導出関数を選ぶ
OpenSSLモードでは、鍵がどのように導出されたかに合わせてPBKDF2(と反復回数)、EVP-SHA256、またはEVP-MD5を選んでください。EVP-MD5はCryptoJSが使用するものです。
- 4
パスフレーズまたは鍵を入力する
正確なパスフレーズを入力するか、正確な生鍵を16進数またはBase64で貼り付けてください。すべてが一致すると、右側にすぐ平文が表示されます。
- 5
失敗した場合は診断を確認する
復号がエラーになった場合、パネルが可能性の高い原因を示します — IVの誤り、鍵の誤り、パディングエラー、Base64の汚染、KDFの不一致など。これにより、当てずっぽうではなく一度に1つずつ設定を調整できます。
AES復号が失敗する理由と対処法
GCM認証に失敗
GCMはタグが検証できない場合、平文を返すことを拒否します。原因はパスフレーズや鍵の誤り、モードの誤り、IVの誤り、または暗号文の改ざん・切り詰めのいずれかですが、GCM自身はどれが原因かまでは教えてくれません。データを暗号化したときの設定と一つずつ照らし合わせてください。
mode: CBC // but the data was encrypted with GCM => Authentication failed
mode: GCM, same passphrase and key size as encryption => plaintext
CBC:最初のブロックが乱れている場合はIVの誤り
CBCではIVは最初の16バイトブロックにのみ影響します。最初のブロックがガベージで残りがきれいにデコードされる場合、IVが間違っています。すべてがガベージの場合は、鍵が間違っています。
iv: 00000000000000000000000000000000 (wrong IV) => first block corrupt, rest readable
iv: (the exact IV used to encrypt) => Attack at dawn!
CBC / PKCS#7パディングエラー
パディングエラーはほとんどの場合、鍵が間違っていることを意味します。暗号文が破損・切り詰められていたり、PKCS#7でパディングされていなかったりした可能性もあります。暗号文全体がコピーされていること、そしてパスフレーズとKDFが一致していることを確認してください。
passphrase: hunter3 // one character off => padding error
passphrase: hunter2 // exact => plaintext
Base64(またはHex)の汚染
暗号文と一緒に貼り付けられた改行、スペース、スマート引用符はデコードを壊します。このツールは空白文字を自動的に除去しますが、文字が欠けていたり余分だったりするとそれでも失敗します。
“U2FsdGVkX1...” (curly quotes and trailing junk copied in)
U2FsdGVkX18AESIzRFVmd1PBwxIFQpF+VgIhTK0aDHQ= (clean Base64)
U2FsdGVkX1を検出したがOpenSSLモードがオフ
入力がU2FsdGVkX1で始まる場合、それはOpenSSL/CryptoJSのSalted__出力であり、通常のパスフレーズ文字列としては復号できません。ツールがバナーを表示するので、「OpenSSLモードに切り替え」をクリックしてKDFを選んでください。
OpenSSL compatible: off input: U2FsdGVkX1... => cannot parse
OpenSSL compatible: on, KDF chosen => plaintext
KDFの不一致(CryptoJSの罠)
PBKDF2やSHA-256では失敗するのにEVP-MD5では復号できる暗号文は、CryptoJSまたはopenssl 1.0.2以前によって作られたものです。コマンドラインでは-md md5が必要です。
KDF: PBKDF2 // CryptoJS ciphertext => padding error
KDF: EVP-MD5 // matches CryptoJS => plaintext
AES復号でできること
- openssl enc出力を復号する
- openssl enc -aes-256-cbcで生成されたSalted__形式のデータを、ターミナルに切り替えることなく読み取れます — Base64を貼り付け、パスフレーズを入力し、KDFを選ぶだけで平文が得られます。
- CryptoJSの暗号文を復号する
- CryptoJSのAES.encrypt(text, passphrase)を使ったレガシーアプリからデータを復元します。EVP-MD5を選んで、そのMD5単回パスの鍵導出に合わせてください — ほとんどの人が見落とすステップです。
- 失敗し続ける復号をデバッグする
- 自分のコードが何かを復号できないとき、ここに貼り付けて、鍵、IV、モード、エンコーディング、KDFのどこに問題があるかを診断パネルで切り分けられます。
- 暗号化の往復動作を検証する
- AES暗号化ページや自分のアプリからの暗号文が、元のバイト列と正確に一致する形で復号されることを確認します。
- 不明な暗号文の正体を理解する
- U2FsdGVkX1のプレフィックスや、IVらしき固定長のプレフィックスなど、形からフォーマットを特定し、鍵を試す前にどのように生成されたのかを把握します。
AES復号の内部構造と形式
- GCM復号 — 認証付き
- GCMは暗号文に対して128ビットのタグを再計算し、平文を返す前に比較します。不一致の場合は破損データを漏らすのではなく例外を投げます。先頭に付加された96ビットのIVを使用します。GCMの失敗は、鍵、モード、IV、暗号文のいずれかが間違っていることを意味しますが、暗号自体はどれが原因かまでは教えてくれません。
- CBC復号 — 最初のブロックとパディングに注目
- CBCには2つの異なる失敗パターンがあります。最初の16バイトブロックだけが乱れていて残りが正しく見える場合、IVが間違っています。すべてのブロックがガベージの場合、鍵が間違っています。PKCS#7パディングエラーは通常、鍵が間違っているか、暗号文が破損・切り詰められたことを意味します。CBCには(HMACのような認証付き構成とは異なり)タグがないため、間違った鍵でもそれらしく見えるバイト列に復号されてしまうことがあります。
- CTR復号 — エラー時も静か
- CTRは決して例外を投げません — 間違った鍵は単にガベージを生成し、それは通常、バイト列をテキストにデコードした時点で「有効なUTF-8ではない」というエラーとして現れます。カウンター/IVを正確に一致させてください。完全性チェックがないため、別途認証していないCTR出力は疑ってかかるべきです。
- 暗号文のレイアウト(F1 / F2 / F3)
- フォーマット1(パスフレーズ)は、ソルト(16)、続いてIV、続いて暗号文で、GCMモードでは16バイトのGCMタグが末尾に付加されます。フォーマット2(生鍵)は、IVに続いて暗号文、または別途IVを入力するベア暗号文です。フォーマット3(OpenSSL)は、ASCIIヘッダーSalted__に続いて8バイトのソルト、続いて暗号文です。どのレイアウトかを知ることで、ソルトとIVがどこにあるかがツールにわかります。生鍵自体はCSPRNGから生成すべきです — 秘密鍵生成ツールを参照してください。
- 鍵導出:データを暗号化したものに合わせる
- 自己完結型のパスフレーズ暗号文の場合、このツールはPBKDF2-HMAC-SHA256を600,000回反復して使用します。OpenSSL/CryptoJSの暗号文の場合は、使用されたKDFを選ぶ必要があります — PBKDF2(openssl -pbkdf2のデフォルトは10,000回反復です。正確な回数を設定してください)、SHA-256を使うEVP_BytesToKey(-pbkdf2を使わないopenssl 1.1以降)、またはMD5を1回だけ使うEVP_BytesToKey(CryptoJSとopenssl 1.0.2以前)です。典型的な「復号できない」バグは、CryptoJSや古いopensslの暗号文をSHA-256で試すことです — EVP-MD5に切り替えればうまくいきます。
AES復号のベストプラクティス
- まず形式を特定することから始める
- 設定をいじる前に、暗号文を見てください。U2FsdGVkX1プレフィックスはOpenSSL/CryptoJSを意味し、このツールで生成された自己完結型の文字列はパスフレーズ形式を意味し、ベアなデータは通常、生鍵と別途のIVが必要です。
- 鍵導出関数を正確に一致させる
- OpenSSL/CryptoJSの暗号文では、KDFはパスフレーズと同じくらい重要です。PBKDF2が失敗する場合はEVP-MD5(CryptoJS、古いopenssl)を試してください。反復回数もアルゴリズムと同様に一致させる必要があります。
- 暗号文をきれいに貼り付ける
- コピーの際に紛れ込む改行やスペースはBase64を壊すことがあります。このツールは空白文字を除去しますが、それでもデコードに失敗する場合は、スマート引用符、文字の欠落、途中で切れたコピーがないか確認してください。Base64ツールで怪しい文字列を検査できます。
- 鍵が間違っている結果を正直に扱う
- CTRやCBCでは、間違った鍵がエラーではなくバイト列を生成することがあります。出力がガベージに見える、またはUTF-8チェックに失敗する場合は、鍵かIVが間違っています — 部分的にそれらしく見える出力を信用しないでください。
- 秘密の暗号文や鍵を決してサーバーに送らない
- ブラウザで復号する意味は、何もページから出ていかないことにあります。アップロードするツールは避けてください。このツールはWeb Cryptoをローカルで使用しており、ネットワークタブで確認するかオフラインにして検証できます。AES-256は強力です — CNSA 2.0でTOP SECRETまで承認されています — なので、復号できない場合、問題は暗号方式ではなくパラメータにあります。
AES復号に関するFAQ
鍵なしでAESを復号できますか?
openssl enc出力を復号するにはどうすればよいですか?
暗号文の先頭にあるU2FsdGVkX1は何を意味しますか?
CryptoJSの暗号文を復号するにはどうすればよいですか?
GCMとCBC — 一方では復号できて、もう一方ではできないのはなぜですか?
ここで復号すると暗号文や鍵はアップロードされますか?
復号時のパスフレーズと生鍵の違いは何ですか?
関連ツール
すべてのツールを見る →AES暗号化ツール — GCM・CBC・CTR対応
セキュリティツール
無料のAESオンライン暗号化ツール — AES-128/192/256、GCM/CBC/CTR、パスフレーズ(PBKDF2)または生鍵に対応。処理は100%ブラウザ内で完結し、外部にアップロードされません。
Bcrypt ハッシュ生成・検証ツール
セキュリティツール
bcrypt パスワードハッシュをオンラインで生成・検証。コスト調整、$2b$/$2a$/$2y$ プレフィックス対応。100% ブラウザ内で処理し、パスワードは一切送信されません。
HMAC ジェネレーター&署名検証ツール
セキュリティツール
無料のオンライン HMAC 生成・検証ツール。Text・Hex・Base64 の鍵で HMAC-SHA256/SHA1/SHA384/SHA512 を計算し、Hex/Base64/Base64URL で出力します。100% ブラウザ内で完結 —— 鍵はページから外に出ません。
JWT デコーダー — オンライン解析ツール
セキュリティツール
JWTトークンを無料のJWTデコーダーでオンラインデコード。ヘッダー、ペイロード、署名、有効期限、アルゴリズム、クレームを即座に検査できます。100%ブラウザ動作 — トークンはデバイスから外に出ません。登録不要、追跡なし。
JWT エンコーダー&ジェネレーター
セキュリティツール
無料のオンラインJWTジェネレーター&エンコーダー。ヘッダーとペイロードを組み立て、HS256、RS256、ES256で即座に署名できます。100%ブラウザ動作 — シークレットと鍵はデバイスから外に出ません。
無料 JWT シークレット生成ツール — HS256/384/512
セキュリティツール
HS256/384/512 向けの強力で RFC 準拠の JWT シークレットを生成。100% ブラウザ内で処理し、サーバーには一切送信されません。base64url・base64・hex で .env 用にコピー。