-->

2017年4月4日火曜日

NES Classic Editionのコントローラの通信内容解析③

ようし、I2Cを使用していることはわかった。信号線の配置もわかった。これでコントローラを自由自在に使いこなせるぞ!え?暗号化?なんですかそれ?

ということで、コントローラと本体ではI2Cで通信を行っているのですが、その通信内容は暗号化されているようです。
例えば、以下のページではI2Cの暗号化された通信内容をダンプしています。
コメを噛め» Blog Archive » Wii クラシックコントローラとの通信

とは言え、所詮はハードウェアで実装されている暗号化なのですでに解析されているようです。

Reverse engineering the Wiimote's encryption
上記が暗号解析成功報告みたいです(2008年)。"weak"という言葉があるので、暗号強度的には弱いのでしょうね、ハードウェア固定ですし。

暗号化のプロトコルについて以下に箇条書します。
  1. 暗号キーは本体側からコントローラ側に送付する
    起動時に本体側から16Byteの暗号キーをコントローラ側に送信する。暗号キーはランダムで生成されるようです。
  2. コントローラ側では暗号キーを基に暗号テーブルを作成する
    "S-Box"という共通鍵暗号化技術を使っているようです(よく知らない)。
  3. コントローラ側から本体側に情報を送るときには暗号テーブルで暗号化してデータを送付する
ここからは電子工作などでクラシックコントローラやヌンチャクコントローラを使用する場合の話です。
  • 本体側を作る場合
    クラシックコントローラなどを機器のコントローラとして使用する場合は、暗号キーを固定値にすることで容易に復号ができます。前述の通り、暗号化に使用する暗号テーブルは起動時に送付する暗号キーによって生成されるので、逆説的に暗号キーを固定すると暗号テーブルも固定されます。すると実質的に復号機能はいらなくなります。
    実際には暗号キーをすべて"0x00"にして使用するということをよくやるみたいです。
  • コントローラ側を作る場合
    コントローラ側の機器を作成する場合は、暗号キーから暗号テーブルを作成する機能と暗号化機能は必須です。さらに本体側がI2Cのマスターになるので作成する機器はスレーブとして機能する必要があります。
    もっとも、所長以外にコントローラ側を作りたい人なんているんですかね?
暗号化するためのの実コードは探せば色々なところにありますが、出所は一緒なようでほとんど同じ実装のようです。

実コード掲載のされているページの例
wii-retropad-adapter/src/wii-retropad-adapter at master · bootsector/wii-retropad-adapter · GitHub

次 → NES Classic Editionのコントローラの通信内容解析④