Rabbit ストリーム暗号による暗号化

Rabbit ストリーム暗号(RFC 4503、eSTREAM)でテキストを暗号化。CryptoJS 形式のパスフレーズ、または 128 ビットの 16 進鍵と 64 ビット IV を使えます。ローカルで動作します。

Rabbit はマイナーなストリーム暗号で、完全性保護がなく、ライブラリのサポートも少ないです。新しいアプリでは AES-GCM を推奨します。

出力は Base64 の OpenSSL「Salted__」形式で、鍵と IV はパスフレーズから導出されます。CryptoJS.Rabbit.encrypt(text, passphrase) と同じ形式です。OpenSSL 自体は Rabbit をサポートしていません。

すべてブラウザ内で実行されます。データがアップロードされることはありません。

Rabbit 暗号化とは?

eSTREAM ポートフォリオの高速な 128 ビットストリーム暗号 Rabbit(RFC 4503)でデータを暗号化します。主に CryptoJS.Rabbit を使う JavaScript プロジェクトで見られ、このツールはそれと互換性のある出力を生成します。

Rabbit 暗号化の使い方

  1. パスフレーズ(OpenSSL 互換) を選んでパスフレーズを入力するか、生の鍵 + IV(16 進) を選んで 16 バイトの鍵と任意の 8 バイト IV を入力します。
  2. 平文 を入力または貼り付けます。
  3. 暗号化 をクリックし、Base64 か Hex の出力を選んで結果をコピーします。

例

入力
Raw key 000102030405060708090a0b0c0d0e0f, IV 0001020304050607, plaintext "Rabbit stream", Hex output
出力
a0e87bbfc85cd88a7e42510ffa

同じ鍵と IV の CryptoJS.Rabbit と同じ結果になります。

Rabbit 暗号化を使うべき場面

CryptoJS の Rabbit を使うアプリケーションとの相互運用や、そのコードのテストに使ってください。新しい設計では、標準化され認証機能のある AES-GCM や ChaCha20-Poly1305 を選びます。

Rabbit 暗号化の仕組み

Rabbit は 513 ビットの内部状態(32 ビットの状態ワード 8 個、カウンター 8 個、キャリービット 1 個)を保持し、1 回の反復で 128 ビットの鍵ストリームを出力して、データと XOR します。鍵は 128 ビットで、任意の 64 ビット IV によりメッセージごとの鍵ストリームが一意になります。パスフレーズモードでは、パスフレーズとランダムなソルトから EVP_BytesToKey(MD5)または PBKDF2-SHA256 で鍵と IV を導出し、Base64 の Salted__ データを出力します。これは MD5 オプションを使った CryptoJS.Rabbit.encrypt(text, passphrase) と同じです。16 進の生の鍵は CryptoJS と同じバイトストリーム順で読み込まれます。RFC 4503 はテストベクターをビッグエンディアンの数値、つまり 16 バイトのブロックを反転した形で掲載しています。

一般的な使用例

  • デバッグのために CryptoJS.Rabbit.encrypt の出力を再現する
  • Rabbit を使う JavaScript アプリ向けのテストデータを作成する
  • ストリーム暗号の挙動を RC4 と比較する
  • RFC 4503 の鍵ストリームベクターを確認する

セキュリティ注意事項

Rabbit に実用的な解読法は知られていませんが、あまり使われておらず、完全性保護もなく、対応するライブラリも少ないです。新しいシステムには AES-GCM を使ってください。

よくある質問

CryptoJS と互換性がありますか?

はい。EVP_BytesToKey(MD5)によるパスフレーズモードは CryptoJS.Rabbit.encrypt(text, "passphrase") と一致し、生の鍵モードは鍵と IV の WordArray を明示した CryptoJS と一致します。

OpenSSL で Rabbit を復号できますか?

いいえ。OpenSSL は Rabbit を実装していません。コンテナ形式(Salted__ + ソルト)が同じなだけです。

IV は必要ですか?

Rabbit では任意ですが、IV がないと同じ鍵は常に同じ鍵ストリームになります。パスフレーズモードでは、ランダムなソルトから毎回新しい IV を導出します。

他のカテゴリを見る