Rabbit でテキストを暗号化・復号する手順

テキスト欄とパスフレーズ欄の 2 つだけです。「暗号化」は平文を CryptoJS の Rabbit 暗号文に変え、「復号」はその暗号文を UTF-8 のテキストに戻します。処理はすべてページ内で完結します。

パスフレーズはどこにも保存されず、実行のたびに新しいランダムなソルトを使うため、同じテキストと同じパスフレーズでも暗号文は毎回変わります。

  1. 上の欄に、暗号化したいテキスト、または U2FsdGVkX1 で始まる既存の Rabbit 暗号文を貼り付けます。
  2. ボタンの隣の欄にパスフレーズを入力します。鍵はパスフレーズから導出されるため、読み戻すときも同じパスフレーズが必要です。
  3. 「暗号化」または「復号」を押します。結果は前回のものを置き換え、失敗したときは古いテキストを残さず消去します。
  4. 「コピー」で結果をクリップボードに取り出し、「クリア」で 2 つの入力欄と結果を空にします。

出力の正体

Salted__ コンテナとランダムなソルト

出力は CryptoJS がパスフレーズ方式で書き出すコンテナです。先頭に ASCII 8 バイトの Salted__(Base64 では U2FsdGVkX1)、続いて 8 バイトのランダムなソルト、その後に暗号文が並び、全体が Base64 で表されます。

128 ビットの鍵と 64 ビットの IV は、パスフレーズとソルトから MD5 ベースの EVP_BytesToKey で導出されるため、パスフレーズがそのまま鍵になるわけではありません。同じテキストでも実行ごとに暗号文が変わるのはソルトが毎回新しいためで、異常ではありません。

確認できること・できないこと

Rabbit は認証タグを持たないストリーム暗号で、このページは改ざんされた暗号文と正常な暗号文を区別できません。Base64 の 1 文字を変えると、復号結果の文字が変わるか、UTF-8 のデコードに失敗してエラー行が出ました(両方を確認)。どちらの場合も「改ざんされた」とは表示しません。

パスフレーズが違う場合は多くの場合 UTF-8 のデコードに失敗してエラー行が出ますが、読める文字列になったからといって改ざんされていない証拠にはなりません。重要な内容では平文のチェックサムと突き合わせてください。

互換性と制限

ここで作った暗号文は、同じパスフレーズを使えば CryptoJS 3.x の Rabbit で読み戻せます。OpenSSL に Rabbit は実装されていないため、openssl enc では復号できません。

入力は貼り付けのみで、アップロードや URL 取得はありません(ファイル選択もありません)。テストでは Chrome で 200 KB を約 0.1 秒で暗号化し、その間のネットワークリクエストは 0 件、結果は次に実行するまで表示されたままでした。

最近使ったツール: