RPG的対戦のプロトコル

ポケモンでアリスとボブが対戦するとき、サーバなしで、できるだけチートができないようにすることを考える。

各ターンの行動前

各ターン開始時に、アリスは2048bitの乱数を生成する。その乱数を行動鍵Aとする。
行動鍵Aのハッシュ値(行動鍵ハッシュA)をボブに送る。
ボブも同様。

各ターンの行動決定

アリスが行動を決定する。行動には誰もが検証可能な一意な行動名Aがつく。"waza_hakaikousen"とか。
アリスは行動名Aと行動鍵AのHMAC(行動名HMAC_A)値をボブに送る。
ボブも同様

行動の確認

アリスは行動鍵Aをボブに送る。また、行動鍵Bをボブから受け取る。
行動鍵ハッシュBを用いて行動鍵Bが正しいことを確認する。

アリスは行動名Aをボブに送る。また、行動名Bをボブから受け取る。
行動名HMAC_Bと行動鍵Bを用いて行動名Bが正しいことを確認する。
ここで、互いに何の行動をしたか判明する。

技の乱数を決定

行動鍵Aと行動鍵Bのxorをとり、乱数シードを生成する。
ボブも同じ乱数シードを生成できる。
その乱数シードをアリスの技の乱数値として合意する。
また、乱数シードのハッシュ値をボブの技の乱数値として合意する。

ステータスや持ち物について

行動と同じような方法で1ターン目に交換する。