🪄 ジェネレーター

ブラウザ内暗号メモ

パスワードでメモをAES-GCM暗号化し、同じパスワードで復号します。鍵の導出から暗号化・復号までブラウザ内で完結し、メモもパスワードも外部へ送信されません。

暗号化と復号の手順

「暗号化」タブでメモとパスワードを入力し、ボタンを押すと暗号文(Base64)が下に出ます。コピーして相手に渡し、相手は「復号」タブに暗号文と同じパスワードを入れて元のメモを取り出します。パスワードは保存されないので、暗号文とは別の手段で伝えてください。

自分の手元で往復を試したいときは、暗号化した直後に「復号」タブへ移り、暗号文の欄を空のままパスワードだけ入れて復号を押せば動作を確認できます(欄が空のときは出力欄の暗号文を使う作りになっています)。「コピー」ボタンは出力欄の暗号文があればそれを、無ければ復号結果をコピーします。

具体例

  • 「会議室の暗証番号は 4821」+パスワード tea-spoon-9v2.k3v...== . pQ... . 9aB... のような v2.salt.iv.本文 形式の暗号文
  • 同じメモを2回暗号化 → salt/IVが毎回ランダムなので、出力Base64は毎回別物になる
  • 復号タブに上の暗号文+ tea-spoon-9 → 「会議室の暗証番号は 4821」を復元
  • パスワードを1文字でも間違える → 「パスワードまたは暗号文が正しくありません」(中身は一切表示されない)
  • 暗号文の一部を削った/改ざんした → AES-GCMの認証に失敗し、同じく復号エラー

暗号文の構造と長さの見積もり

出力はドットで区切った4つの部分から成ります。復号側はこの形を見て、どの世代の暗号文かを判断します。

部分中身Base64での文字数
v2形式のバージョン標識2(+区切りのドット)
salt16バイトの乱数。同じパスワードでも毎回別の鍵になる24
IV12バイトの乱数(AES-GCMの初期化ベクトル)16
本文暗号化した本文+16バイトの認証タグ本文のバイト数に比例

したがって暗号文の長さの目安は 66 + 本文のUTF-8バイト数 × 1.34 文字です。「会議室の暗証番号は 4821」は全角9文字+半角5文字=32バイトなので、暗号文は109文字になります。日本語は1文字が3バイトなので、全角10文字増えるごとに暗号文は約40文字伸びます。QRコードやチャットの文字数制限に収めたいときはこの見積もりが使えます。

Base64には + / = が現れるため、URLのクエリに直接載せる場合はURLエンコードが必要です。本文中に改行が入っても復号側は無視しますが、先頭の v2 やドット区切りが失われると復号できません。メールの引用記号(>)や箇条書きの記号が頭に付いた状態で貼るのが典型的な失敗です。なお、v2 が付かない3部構成の古い暗号文(PBKDF2 10万回で作成したもの)も、そのまま復号できるようになっています。

安全性を決めるのはパスワードの強さ

鍵はパスワードからPBKDF2-HMAC-SHA256で60万回ストレッチして作ります。この反復回数は、PBKDF2について広く参照されているOWASPの推奨値に合わせたものです。総当たり1回ごとに同じ計算を強制するための仕組みなので、暗号化・復号のボタンを押してから結果が出るまでに端末によっては1秒前後かかることがあります。これは遅いのではなく、意図したコストです。

一方で、反復回数をいくら増やしても1234passwordのような推測されやすいパスワードは守れません。辞書に載る語や誕生日を避け、無関係な単語を4つ以上つないだパスフレーズか、パスワード生成で作った十分な長さの文字列を使ってください。saltが毎回変わるため、事前計算した表(レインボーテーブル)で一括攻撃されることはありませんが、パスワード自体が弱ければ意味がありません。

安全な共有の型

暗号文とパスワードを別々の経路で渡すのが基本です。暗号文はチャットに貼り、パスワードは口頭や電話で伝える、という組み合わせなら、片方の経路が覗かれても中身は読めません。同じチャットに続けて2通送るのは、鍵付きの箱と鍵を同じ封筒に入れるのと同じで意味がありません。

  • 有効期限の仕組みはありません。暗号文はチャット履歴やメールに残り続け、パスワードが漏れれば後からいつでも読めます。共有後は履歴の削除を依頼するか、パスワードを使い回さない運用にしてください。
  • 復号結果は画面に残ります。復号欄は編集できないので、読み終えたらタブを閉じるかページを再読み込みしてください。
  • 相手が同じツールを開ける必要があります。形式は独自なので、汎用の暗号ソフトでは復号できません。相手にはこのページのURLも一緒に伝えてください。

このツールで守れないこと

AES-GCMは1バイトの改変も検出しますが、これは改ざんの検知であって送信者の証明ではありません。パスワードを知る人なら誰でも同じ形式の暗号文を作り直せるため、「誰が書いたか」は保証されません。また、パスワードは一切保存されず復元手段もないので、忘れた暗号文は誰にも復号できません。長期保管や資格情報の管理にはパスワードマネージャを使い、このツールは短いメモの一時的な受け渡しに限って使うのが安全です。

端末そのものが侵害されている場合(キーロガーや画面録画)は、ブラウザ内で完結していても入力は盗まれます。復号エラーの文言はパスワード違いと改ざんで同じにしてあり、どちらが原因かを攻撃者に教えません。暗号処理はブラウザのWeb Crypto APIを使うため、HTTPSで開いた状態が前提です。

よくある質問

入力データはサーバーに送信されますか?
いいえ。処理はすべてブラウザ内で完結し、外部に送信・保存されません。
暗号文の共有方法は?
暗号文(Base64)をコピーし、同じパスワードを知る相手が復号します。サーバーは使いません。パスワードは暗号文とは別の手段(口頭・別アプリなど)で伝えてください。
パスワードを忘れたら復号できますか?
できません。パスワードはどこにも保存されず、復元手段もありません。忘れた暗号文は誰にも(運営にも)復号できないため、パスワードは確実に控えてください。
どの暗号方式を使っていますか?
AES-GCM(256ビット)です。パスワードはPBKDF2(SHA-256・60万回)で鍵に変換し、salt(16バイト)とIV(12バイト)は暗号化のたびに乱数(crypto.getRandomValues)で生成します。暗号文は v2.salt.iv.本文 をBase64で連結した形式です。同じメモでも出力は毎回変わります。以前の形式(v2なし・PBKDF2 10万回)で作成した暗号文も、そのまま復号できます。
暗号文はどれくらい長くなりますか?
目安は 66 + 本文のUTF-8バイト数 × 1.34 文字です。全角9文字+半角5文字(32バイト)のメモなら109文字になります。日本語は1文字3バイトなので、全角10文字増えるごとに暗号文は約40文字伸びます。QRコードやチャットの文字数制限に収めたいときの見積もりに使えます。
パスワードは合っているはずなのに復号できません
暗号文の前後に余分な文字が混ざっていないか確認してください。メールの引用記号や箇条書きの記号が頭に付いた、先頭の v2 が欠けた、ドット区切りが消えた、といったケースで失敗します。本文中の改行は無視されるので折り返しは問題になりません。AES-GCMは1バイトの改変も検出するため、パスワード違いと改ざんは同じエラー表示になります。