⚠️注意

本ページは 問題(1)解説問題(2)解説 を読んでいることが前提になります。


今回の問題で紹介したアルゴリズムをプログラムとして実装する際には、紙の上で数式を扱うだけでは現れない気をつけるべき点がたくさんあります。

以下ではその例をいくつか紹介します。

扱える整数の有限性による秘密情報の漏洩

RS アルゴリズムでは以下の処理がありました。

あなたが $r\in\{0,1\}$ を秘密裏に生成し、その Share $r^{(1)}, r^{(2)}$ をそれぞれ人 1,2 に配布します。

ここでは $r$ を生成出来たとして, その後の $r^{(1)}, r^{(2)}$ に分割する操作に注目してみます。

一見すると整数 $r^{(1)}$ をランダムに作成し、 $r^{(2)} \coloneqq r - r^{(1)}$ で定めればいいように思えます。

しかし実際にはすべての整数からランダムに数を作成することは難しく, また受け取り手からしても $10^{10^{10}}$ のような非常に大きい数が送られてくる可能性を考慮しておかないといけないのは大変です。

そこで Acompany ではある整数 $L,R$ を取り決め、 $L\leq r^{(1)} \leq R$ を満たす $r^{(1)}$ をランダムに取ると言う仕様にしています。

しかし、この $L,R$ を人2が知っていた場合、 人2は $r^{(2)}$ を受け取った際に以下のようにして $r$ を知ってしまう可能性があります。

論文にはこう言った実装するにあたってのコーナーケースまでは書いていないことも多く、自分で気付き対策を考える必要があります。

対策としては例えば $(L,R)=(-10^{18}, 10^{18})$ のような非常に大きい値を取ると言った方法が考えられます。

これは非常に単純かつ力技な対応ですが、 $r$ が特定出来てしまうケースの発生確率を $10^{-18}$ 以下と言う大変小さな値に抑えることが出来る強力な手法になります。

しかし Share の存在範囲を広く取ることは次に述べる問題を引き起こしやすくなります。

情報落ち・桁落ち・オーバーフロー