ボタン実行から出力まで
このツールは,平文とパスワードを入力し,「暗号化を実行」を押した時点で処理を始めます.入力中に暗号文を更新するリアルタイム処理ではありません.平文またはパスワードのどちらかが空ならエラーを表示し,空文字だけを暗号化することもできません.入力内容を確認してから,利用者が明示的に実行する方式です.
実行時には,平文とパスワードをTextEncoderでUTF-8のバイト列へ変換します.続いてブラウザのcrypto.getRandomValuesを使い,16バイトのSaltと12バイトのIVを暗号化ごとに新しく生成します.同じ平文とパスワードで再実行してもSaltとIVが変わるため,通常は前回と異なる暗号文になります.以前の出力を再現するのではなく,毎回新しい組み合わせを作る動作です.
出力エンコードはHexまたはBase64から選べます.これは暗号方式を変更する設定ではなく,生成されたバイト列をコピー可能な文字列で表す方法の違いです.Hexは1バイトを2文字で表すため長くなり,Base64は同じバイト列を比較的短く表せます.どちらを選んでも,鍵導出とAES-GCMの固定条件は変わりません.
形式の選択は,次に暗号化を実行するときに反映されます.すでに表示されている結果は,ラジオボタンを切り替えただけでは再エンコードされません.別形式の結果が必要なら形式を選び直して再実行します.その場合はSaltとIVも新しくなるため,文字列表現だけでなく暗号文そのものも前回とは異なります.
PBKDF2とAES-GCMの固定条件
入力したパスワードは,そのままAES鍵として使いません.Web CryptoのPBKDF2へUTF-8のパスワードと16バイトのSaltを渡し,SHA-256を使って100,000回反復し,256ビットのAES-GCM鍵を導出します.これらの方式と数値は画面から変更できず,現在の実装に固定されています.
平文の暗号化にはAES-GCMと12バイトのIVを使います.tagLengthはコードで指定していないため,W3C Web Cryptography仕様の既定値である128ビットが適用されます.subtle.encryptが返す値は暗号文本体Cと認証タグTを連結したバイト列です.
画面の「暗号文」欄にもタグ込みの値を表示し,タグだけを別欄へ分ける機能はありません.追加認証データ,いわゆるAADも指定していません.
AES-GCMは機密性と改変検知を組み合わせた認証付き暗号です.ただし,「AES鍵が256ビット」であることと,入力したパスワードが256ビット相当の推測困難性を持つことは別です.暗号文とSaltを得た第三者は,候補となるパスワードで鍵導出と復号を繰り返すオフライン推測を試みられます.
PBKDF2の反復は1回ごとの計算量を増やしますが,短い単語や再利用パスワードを自動的に強くする機能ではありません.
NIST SP 800-132はパスワードから保存データ保護用の鍵を導出する方法,Salt,反復回数を扱いますが,2010年公開の文書で改訂予定も示されています.このツールの100,000回という固定値を,あらゆる端末・データ・将来時点で十分な値だとは断定できません.利用者は長く固有で推測されにくいパスフレーズを選び,AESの鍵長だけを安全性の根拠にしないでください.
一括暗号化テキストの構造と長さ
結果欄には,Salt,IV,タグ込み暗号文を個別に表示するとともに,この3要素を半角コロンで連結した一括暗号化テキストを表示します.構造は左からSalt,IV,暗号文の順です.パスワードは含まれません.復号に必要な値をまとめてコピーしたい場合は一括欄を使い,パスワードは別に管理します.
具体例として,UTF-8へ変換した平文が12バイトなら,128ビット,つまり16バイトの認証タグを加えた暗号文欄の実体は28バイトです.Hex出力では16バイトのSaltが32文字,12バイトのIVが24文字,タグ込み暗号文が56文字になります.2個のコロンも含めると,一括文字列は32+1+24+1+56で114文字です.
日本語の「秘密メモ」はUTF-8で12バイトなので,この長さ計算の入力例になります.
Base64を選ぶと,同じ12バイト平文の例ではSaltが24文字,IVが16文字,タグ込み暗号文が40文字となり,コロン込みで82文字です.末尾のイコール記号もBase64データの一部です.メールやフォームへ貼る際に削らないでください.文字化けを避ける目的でHexやBase64へ変換しているのであり,このエンコード自体が暗号強度を追加するわけではありません.
一括形式は自己記述形式ではありません.文字列の中にPBKDF2,SHA-256,100,000回,AES-GCM,タグ長,UTF-8,ツールの版番号を保存していないため,文字列だけから固定条件を判定できません.将来も復号する必要があるデータでは,利用した方式と条件を別途記録し,元データや復旧手順も管理してください.このサイトの実装が将来変更されても,旧形式を永続的に復号できる保証はありません.
復号入力と失敗表示の読み方
復号には,暗号化時のパスワードと,正しいSalt,IV,タグ込み暗号文が必要です.入力方法は,一括暗号化テキストを貼る方法と,3要素を個別欄へ入れる方法の2通りです.一括入力では半角コロンで分割した要素がちょうど3個でなければ,形式エラーになります.個別入力ではHexかBase64を利用者が選びます.
一括入力の形式は,3要素すべてが0〜9,a〜f,A〜Fだけで構成されていればHex,それ以外ならBase64としてデコードを試みます.この判定は一括文字列に形式名が入っているわけではなく,文字の並びを見た簡易判定です.このツールが生成する16バイトSaltの標準Base64表現には末尾のイコール記号が付くため,通常の生成結果はHexだけの文字列とは区別できます.
復号では同じPBKDF2条件で鍵を導出し,入力されたIVと暗号文をsubtle.decryptへ渡します.パスワードが違う,SaltやIVが違う,暗号文または認証タグが欠けている,保存中に値が変わった,といった場合は認証に通らず復号が失敗します.AES-GCMの認証タグは改変の検出に使われますが,特定のデータについて絶対に誤受理が起きないと保証する説明ではありません.
この画面は復号処理で起きた例外を個別分類せず,「パスワードが正しくないか,データが破損しています」とまとめて表示します.したがって,表示だけではパスワード違い,Salt・IV違い,エンコード形式の選択違い,暗号文の欠損を特定できません.失敗時は,まず一括文字列のコロンが2個か,前後に余計な文字がないか,個別入力の形式選択が合っているかを確認し,その後に保存元の値とパスワードを照合します.
復号結果はTextDecoderで文字列へ戻します.このツール自身が作るデータはUTF-8の平文を前提にしているため,別ソフトがバイナリデータや別文字コードを同じ暗号条件で処理した値を入力しても,意図した文字列になるとは限りません.他製品との互換性は,アルゴリズム名だけでなくSalt,反復回数,タグの連結位置,文字コードまで一致する必要があります.
保存,コピー,通信の範囲
入力した平文,パスワード,生成したSalt・IV・暗号文,復号した平文は,表示中のReact状態とDOMに置かれます.ローカルストレージやIndexedDBへ履歴を保存する処理,ファイルへ自動保存する処理,パスワードマネージャーへ登録する処理はありません.ページを再読み込みすれば画面の状態は初期化されますが,JavaScript文字列が使用したメモリ領域をゼロで上書きする処理はなく,物理メモリ上の痕跡消去を保証しません.
暗号化コンポーネントには,入力内容を暗号化・復号目的でサーバーへ送る処理がありません.一方,これはウェブページ全体の無通信を意味しません.ページを構成するファイルの取得,アクセス解析,広告など,暗号化機能とは別の通信が発生する場合があります.「暗号処理の入力を送る実装がない」ことと,「ページから通信が一切ない」ことを分けて判断してください.
コピーボタンはClipboard APIの書き込み完了を待ち,成功した場合だけチェック表示へ切り替えます.権限や実行環境により失敗した場合はエラーを表示します.2秒後に戻るのはボタンの見た目だけで,クリップボードの内容を消去する処理ではありません.OSやクリップボード履歴アプリが平文,パスワード以外の出力,復号結果を保持する可能性はこのページから制御できません.
画面には暗号化結果の保存ボタンや自動バックアップがありません.必要な一括暗号化テキストは利用者がコピーして保存します.コピーの成否表示だけに頼らず,保存先へ貼り付けた後に先頭・末尾やコロン区切りが欠けていないか確認してください.重要なデータでは,元の平文を直ちに消す前に,保存した暗号文から実際に復号できるかを別の手順で確かめる必要があります.
利用時の判断と非対応範囲
パスワードは長く固有で推測されにくいものを選びます.同じパスワードを他のサービスで再利用すると,別の漏えいがこの暗号文のオフライン推測にも影響します.SaltとIVは一般にパスワードのような秘密値ではありませんが,正しい復号には必要です.パスワードと,一括暗号化テキストまたは3要素のセットを失わないよう,役割を分けて管理してください.
暗号文とパスワードを相手へ渡す場合,両方を同じメッセージに並べれば,そのメッセージへアクセスできる人が復号できます.共有経路や本人確認はこのツールの範囲外です.受け渡し方法,保存先のアクセス制御,バックアップ,削除時期は用途に合わせて決めてください.パスワードを忘れた場合のリセット,回復用キー,管理者による復旧は実装していません.
この画面は貼り付けたテキスト向けで,ファイル選択,フォルダー処理,鍵配布,共同編集,版管理,期限付き共有には対応しません.入力文字数の上限は画面に表示していませんが,処理時間とメモリ使用量はブラウザや端末に依存するため,大容量データの処理能力を保証しません.ファイルを扱う場合は,ファイル向けの暗号化手段と復元テストを選んでください.
AES-GCMで暗号化しても,入力前に内容を取得するキーロガー,復号後の画面を読むマルウェア,画面の盗み見,フィッシング,弱い端末認証,誤った相手への共有は防げません.方式名だけで利用環境全体が保護されるわけではありません.パスワード候補が必要ならパスワード生成器,ファイルを扱うならファイル暗号化ツール,元へ戻さず同一性だけ確認するならハッシュ計算ツールというように,目的ごとに機能を使い分けてください.