誤り訂正符号の鍵方程式で遊ぶ(パート1)
符号ベースの暗号技術(符号とか知ってる人向け)
途中ですが公開しておきます。
この記事では、エラー位置とシンドロームを公開鍵とし、割り算アルゴリズムに使った多項式を秘密鍵にして符号を決定します。エラー位置を公開鍵にすることよって、符号を使った暗号系の鍵サイズを大幅に減らすことができる新型になるかも知れません。(その代わり通信に必要なデータのサイズがすごく増えます)
もしシンドロームとエラーから符号を求めるのが難しければ、これも公開鍵暗号の1つとして成り立つというわけです。
Goppa符号は1970年代に符号長を伸ばしたときの性能が良い代数的符号として考えられた。
符号の元を2進表記にしたものをバイナリ符号というのだが、このバイナリにバラしたものにスクランブル行列と置換行列をかけたものは、符号の構造が隠されて鍵に対する攻撃から守ることができる。
ここで、Goppa符号をそのまま認証符号やハッシュ関数として使用するのはやめたほうが良いと分かる。
なぜなら割り算アルゴリズムは、任意のシンドロームに対する複数の符号とエラーの対を計算できるからである。
そこでシンドロームに対する、(異なる符号との)衝突(コリジョン)を見つける方法について書きます。
シンドロームから割り算だけで符号を逆算する
いま任意のバイト列をシンドローム多項式
この4つの関数の関係式は、
と書ける。この式は符号理論で鍵方程式と読ばれています。これは、
のように書くこともでき、符号の復号でよく見かけます。
ここで
まず、上の式を変形して次のようにする。
この式の
この関数で全体を割れば、一発で符号多項式が計算できます。
つまり、
実際1次多項式を因子に持たない(持つと符号が短くなる)多項式の全てはGoppa符号に使えるので、この式も一発で計算できるはずです。
当たり前のようだが、任意のシンドロームに対するエラーベクトルと符号の対を求める方法がこれで実現できるはず。やってみると実に当たり前で、符号の数は沢山ある。
シンドロームとエラー位置だけでは符号多項式が多すぎて1つにさえまとまらない。
あるいは、符号多項式の中でも既約なものだけを許すとか。(これが符号にどのような影響を及ぼすかは理解していない。)
鍵方程式をいじるだけで一生が終わってしまいそう。
鍵空間が
こうして任意のシンドロームに対応するエラーと符号の対を見つける方法ができたのだった。
エラーベクトルから1つのシンドロームへの写像の数は、定義体を
この中から、
このような衝突(コリジョン)は暗号の世界ではクローと呼ばれている。
ここでは異なる符号をまたいだシンドロームのクローは簡単に見つけられる事が分かった。
もしクローを見つけるのが実際に困難であれば、偽造不可能な電子署名が作れるはずであるが、Goppa符号の場合、このように簡単にクローが見つかってしまうのでクローフリー関数対としては使えないことが分かる。
こんなの何に使えるのかと聞かれると困る。そこで、
この性質を利用して、鍵委託や秘密分散に使えないだろうかと思っている。
普通は意味のないビット列のかわりに、意味のある言葉を使うことができるというのは意外なことに気がついた。つまり同一のシンドロームから異なるエラーベクトルが得られることを利用すれば、
参考文献:
[1] A new identification scheme based on syndrome decoding.
[2] A Zero-Knowlede Identification Scheme Based on the q-ary Syndrome Decodiong Problem.
Discussion