おまいら最強の麻雀プログラムしてみろよ Part4
サーバを置かずに互いに信用できないクライアント(プレイヤー)A,B,C,Dだけで
不正困難かつランダムな配パイが可能か考えてみた。
【ゲーム開始時にのみ信用できるサーバSを使用する場合】
いきなり前提と違っているけれど、これは可能。
(不正が絶対に不可能ではなくて、計算量的に困難)
1.A〜Dはワンタイムパッド(Ra〜Rd)を各自用意して、それをサーバSにだけ知らせる。
2.A〜Dは、互いに各自のワンタイムパッドを否認できないようにする。
(何らかのメッセージダイジェスト(MD5でもSHA-?でも)を利用する)
3.サーバSはシャッフルした牌のデータXを生成し、P=X+Ra+Rb+Rc+Rdをクライアントに公開する。+はXOR。
4.ゲーム開始後たとえばAが山にあるi番目の牌を引く場合は、B〜Dが乱数パッドのiブロック目(Rb[i], Rc[i], Rd[i])を
全員に公開する。つまりP[i]+Rb[i]+Rc[i]+Rd[i]は公開され、Aは秘密にしているRa[i]とそれ(←)との
XORを計算することで自分に配られた牌X[i]を知ることができる。
5.ゲーム終了後、2.の情報を使って各自のワンタイムパッドに不正がなかったか互いにチェックする。
2.と5.はメッセージダイジェストじゃなくて素直に暗号化とパスワードのほうがわかりやすいかも。
と思いのほか説明が長くなってしまったけどここまではイントロ。問題はこれ↓。
【サーバを使用しない場合】
結論:
ア.俺の頭では_。XORや1:1写像を検討したけどダメだった。
牌を引いたプレイヤーではない者一人が引かれた牌を知ることができてしまうやり方にしかならなかった。
そこをなんとかしようとすると、今度は牌の整合性が取れなくなる(同じ牌が5つ以上登場したり)。
イ.でもたぶん、暗号理論を使えばできるんじゃないかな。
俺は理解してないけど、電子投票とかゼロ知識証明とかその辺の話を聞いてるといけそうな感じがした。
ウ.暗号理論(群論?)に明るい人が降臨してくれると嬉しい。