# RC4 アルゴリズムによる暗号化 (overview)

## 説明

### 目的と制限

RC4 アルゴリズムによる暗号化関数は、動作が軽い手軽な暗号化を行えるように用意しています。 利用法としては、ゲーム中に動的に生成されたデータを平文のままネットワークに流したくない場合や、 バックアップに平文のまま保管したくない場合などを想定しています。

RC4 は共通鍵暗号ですので、基本的にはソフト内に暗号化・復号双方で用いる鍵データを保管しておく必要があります。 そのため、ROM バイナリの解析によって鍵が明らかになり、暗号が危殆化する可能性があります。 この関数のみを用いて、機密度の高いデータの暗号化や、データの作成者の認証を行わないでください。

なお、データの作成者の認証をしたい場合は、`CRYPTO_VerifySignature()` による電子署名の認証機能が利用可能です。

### RC4 アルゴリズムの特徴

RC4 アルゴリズムは、以下の特徴を持っています。

- 共通鍵暗号である。
- ストリーム暗号である。
- 暗号化・復号処理が高速である。
- 効果的な解析手法が発表されていない。

ストリーム暗号では入力バイト数と出力バイト数が一致しますので、使用は簡単です。 反面、いくつかの注意点に気をつけて使わないと、思わぬ脆弱性が残ったままになることがあります。 以下に記述する注意点に留意してください。

### RC4 アルゴリズムの原理

RC4 アルゴリズムの基本的な動作は、鍵から一意に決定される乱数列を作成し、元データと XOR を取る、というものです。 そのため、同一の鍵からは常に同じ暗号用の乱数列が生成されることに注意が必要です。 これは以下を意味します。

1. 同じ鍵・同じデータからは常に同じ暗号データが生成される。すなわち、どの暗号文とどの暗号文が同一の平文を持つかが分かる。（辞書攻撃）
2. 同じ鍵から作成された2つの暗号データの XOR を取ると、それぞれの平文を XOR したものを取得することができる。（差分攻撃の一種）
3. 暗号文の任意の位置のビットを反転させることで、復号後のデータのビットを反転させることができる。（ビット反転攻撃）

辞書攻撃と差分攻撃を回避するためには、毎回異なる Initialization Vector (IV) と呼ばれる値を用意し、 共通鍵に IV を加えたものを実際の鍵として RC4 アルゴリズムを適用する必要があります。 暗号データを送信する際には、一緒に IV も（暗号化せずに）送るようにします。 例えば、RC4 関数に鍵として渡す 128bit のうち、96bit を真の秘密鍵として扱い、 残りの 32bit は IV として毎回異なる数で埋めます。

ビット反転攻撃を回避するには、送信するデータに MD5 や SHA-1 などのメッセージダイジェスト値をつけるようにします。 攻撃者は元のデータが分かりませんので、任意のビットを変化させることはできても、正しいメッセージダイジェスト値を 計算することはできません。MD5 と SHA-1 を求める関数は TWL-SDK に用意されています。

詳細は、一般的な暗号の書籍を参照してください。

## 参照

`CRYPTO関数一覧
`

## 履歴

2006/03/07 初版