CalcMint

AES 暗号化・復号

パスワードでメッセージを暗号化してあとで復号したり、鍵とIVを直接指定して自分のコードの動作確認をしたりできます。処理はWeb Crypto APIで端末の中だけで行います。

AES 暗号化・復号

このツールを自分のサイトに埋め込む

コードをコピーしてページのHTMLに貼り付けてください。無料です。クレジットのリンクは残してください。

パスワード方式のしくみ

パスワードはランダムな16バイトのソルトとともに、PBKDF2-HMAC-SHA256(60万回、OWASPの推奨値)で256ビットの鍵に変換します。本文はランダムな12バイトのnonceを使ってAES-256-GCMで暗号化し、ソルト+nonce+暗号文+16バイトの認証タグをBase64にしたものが結果です。同じ文を2回暗号化しても毎回違う結果になりますが、これは正常です。

ほかの環境でも数行で復号できます。Pythonのcryptographyパッケージなら次のとおりです。

import base64
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

data = base64.b64decode(ciphertext)
salt, nonce, body = data[:16], data[16:28], data[28:]
key = PBKDF2HMAC(hashes.SHA256(), 32, salt, 600_000).derive(password.encode())
print(AESGCM(key).decrypt(nonce, body, None).decode())

AESの基本

AES(FIPS 197)は、2001年にNISTが標準化したブロック暗号です。16バイトのブロックを128・192・256ビットの鍵で暗号化し、ブロックのつなぎ方は「モード」で決まります。CBCはパディングとランダムなIVが必要、CTRはAESをストリーム暗号として使う方式、GCMは暗号文の改ざんを検出する認証タグを付ける方式です。パスワードや鍵をなくすとデータは二度と取り出せません。

よくある質問

どの方式を選べばいい?

自分で使うなら初期設定のパスワード方式(AES-256-GCM)がおすすめです。認証付きなので、パスワード違いや改ざんを検出できます。CryptoJS.AESやopenssl encを使うコードとやり取りするならOpenSSL・CryptoJS形式、特定の実装に合わせるなら鍵とIVの直接指定を選んでください。

U2FsdGVkX1で始まる暗号文も復号できる?

パスワードがわかれば復号できます。U2FsdGVkX1は「Salted__」をBase64にしたもので、CryptoJSやOpenSSLが付けるヘッダーです。古いMD5方式と新しいSHA-256方式の鍵導出を自動で試します。

ECBモードがないのはなぜ?

安全でないため、ブラウザが提供していません。同じ平文のブロックが同じ暗号文になり、パターンが漏れてしまいます。CBC、CTR、できればGCMを使ってください。

貼り付けた内容はサーバーに送られる?

送られません。このツールはJavaScriptとブラウザ内蔵のWeb Crypto APIだけで、すべて端末の中で動きます。入力・貼り付け・読み込んだ内容がアップロードや保存されることはありません。

関連する計算ツール