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

このページはブラウザ内でテキストを RC4 で暗号化・復号します。結果は U2FsdGVkX1 で始まる CryptoJS のパスフレーズコンテナの Base64 テキストで、同じパスフレーズを入力すれば元の文に戻ります。RC4 は既知の偏りがある古いストリーム暗号です。古いデータを読む用途や他ツールの出力を再現する用途に向き、新しく守るべき情報には使わないでください。

テキストとパスフレーズはページ内にとどまります。送信は一切なく、ネットワークを切った状態でも処理は完了します。保存もされないため、パスフレーズを失うとここでは復元できません。入出力はテキストのみで、ファイルのアップロード、バイナリモード、ダウンロードボタンはありません。

  1. 暗号化したいテキストを入力欄に貼り付け、鍵の欄にパスフレーズを入力します。
  2. 「暗号化」を押すと、下のパネルに Base64 の結果が表示されます。同じテキストと同じパスフレーズでも毎回異なる文字列になります。実行ごとに新しいランダムなソルトを使うためです。
  3. 復号するときは、Base64 文字列を丸ごと入力欄に貼り付け、同じパスフレーズを入力して「復号」を押します。
  4. Copy は結果をクリップボードにコピーし、Clear は入力欄・パスフレーズ・結果を空にします。
  5. パスフレーズは安全な場所に保管してください。処理の中で唯一の秘密であり、ページ側にはパスフレーズもテキストも残りません。

コンテナの構造、OpenSSL との違い、RC4 の限界

Base64 の結果の中身

出力は CryptoJS のパスフレーズコンテナです。8 バイトの Salted__(先頭が U2FsdGVkX1 になる理由です)、8 バイトのランダムなソルト、その後に RC4 の出力が続き、全体が Base64 で符号化されています。鍵素材はパスフレーズとソルトから EVP_BytesToKey(MD5)で導出され、32 バイトになります。検証では、この導出を独立実装して本ページの出力を復号でき、同じ方式で作った暗号文を本ページで復号できました。

復号はコンテナからソルトを読み取るため、暗号文と一緒に渡す必要があるのはパスフレーズだけです。ソルトが異なれば鍵ストリームも変わるので、同じ文でも実行のたびに違う文字列になり、そのどれもが同じテキストに戻ります。平文は UTF-8 として読み取るため、有効な UTF-8 でない内容はここでは扱えません。

OpenSSL と本ページの RC4 は互換ではない

OpenSSL は 16 バイトの RC4 鍵を導出し(openssl enc -rc4 -md md5、-rc4-40 は 5 バイト)、本ページの CryptoJS は 32 バイトを使うため、互いの出力を読めません。検証では、OpenSSL は本ページの暗号文を意味のないデータに変え、本ページは openssl enc -rc4 のコンテナに対してパスフレーズ誤りのメッセージを返しました。長い鍵を渡しても解決しません。-K に 64 桁の 16 進数を指定すると「hex string is too long, ignoring excess」と表示され、先頭 16 バイトだけが使われます。

互換を取るには同じ鍵導出を実装する必要があります。パスフレーズとソルトに EVP_BytesToKey(MD5) を適用し、先頭 32 バイトを取って RC4 を実行します。変更なしで使えるコマンドライン側が必要なら、この系列の AES ページが openssl enc -aes-256-cbc -md md5 とそのまま一致します。openssl enc -rc4 自体も旧式で、OpenSSL 3 では legacy プロバイダ経由でしか提供されません。

誤ったパスフレーズ、改変、途中で切れた暗号文

誤ったパスフレーズや、このコンテナでない文字列は、ページの言語でボタンの下に表示されます。判定は復号後のバイト列が有効な UTF-8 かどうかだけなので、目安にはなっても保証にはなりません。検証では誤ったパスフレーズ 24 回すべてで表示されましたが、偶然テキストとして解釈できる鍵ストリームは警告なしで通ります。

RC4 には認証がなく、改変も切り詰めも確実には検出できません。暗号文の 1 バイトを反転させると復号結果の 1 文字だけが変わり、警告は出ませんでした。暗号文を約 60 % の長さに切り詰めると、文の前半が完全なメッセージであるかのように返りました。改変を検知したい用途には AES-GCM のような認証付き暗号を使ってください。このページは古い RC4 データの再現と確認のためのものです。

最近使ったツール: