この言語で掛け算はできますか?
2008.09.29
ちょっと例の Fiat-Shamir 認証のデモプログラムを土日に書いていたのですが、この Fiat-Shamir 認証のキモというのは、
平方剰余問題は、法が合成数の場合、とっても難しい....
ということにあります。ですから、
x2 = 巨大数 (mod 巨大素数同士の積)
のとき、巨大数が判っても、x は判らない....ということになるわけです。ですから、この2つの巨大数(法と自乗値)を公開してもOKなのです。この2つの巨大数を使って、証明者が提示する証明を、証明者から渡された自乗の値と、認証者が自分で計算する自乗の値とが一致することで確認できますが、それでも、
絶対に証明者の秘密の数である x は判らない
ことが保証されるわけです。
まあ、まず最初のデモは、とりあえず巨大数じゃなくていいです。そっちの方が簡単にチェックできるでしょ。しかし、ここにちょっとしたトラップがあります。
x2 の桁数は?
という問題なのですね。モダンな言語を使い慣れていると、
int x = getInt();
int x2 = x * x;
なんて、気楽に書いてしまいがちですが、このコードに潜む危険性をしっかり理解してないと、ハマりますよ.....それはですね、当然、
x が √Integer.MAX_VALUE を超えていたらどうするの?
という問題ですよね! 私なんかの世代はアセンブリの経験があったりしますから、
MOV AH, byte ptr [BX]; 掛ける数は byte
MUL AH, AH
MOV result, AX ; 結果は word
と、
byte × byte = word(2byte)
word × word = dword(4byte)
と「掛け算だったら結果格納にメモリは2倍必要!」というイメージがそもそもあるわけですけどもね....そういう視点で、
じゃあこの Fiat-Shamir 認証のサービスを記述するのは、どの言語でやればいいだろう?
というのが、実は大問題になるわけです。早速結論を言ってしまいますが、それは
Ruby か Python
です。この手のスクリプト言語なんて
本質的にはドレもコレも同じ....
という印象を持ちがちですが、ここで Ruby(or Python) を強力に推薦する理由がアルのですね。それは、
数値型は、それが FixNum(31bit or 63bit の固定長)の表現範囲を超える場合、自動的に BigNum(無限多倍長整数)に拡張される
という、非常に都合のイイ性質を持っているのです!
一番最初、私はこのサービスを、Perl で書いた(一番慣れてるし)のですが、これ、
値を自乗すると、微妙に渡された正しい値と違う...
という現象に出くわして、「!」となったわけです。つまり、Perl は、
数値をウラでは浮動小数点値として計算する
という仕様にひっかかっているわけです。他の p言語と合わせて表にすると、
| Ruby | FixNum と BigNum を自動で使い分ける |
| Perl | すべてウラではFloat |
| PHP | 31bit固定 |
| Python | 整数型と長整数型を自動で使い分ける |
ですから、Ruby か Python がよろしい....という結果になるわけです。ですから、本番の巨大数(256bitくらいは必要)を扱う場合でも、BigNum な値を透過的に変換する言語ならば、
一切コードの変更も要らない!
となるわけです...こういう言語選択の基準もあるわけですよ。
投稿者 : 杉浦 こずえ | 投稿日時 : 2008.09.29 10:24
あすなろBLOGのトラックバック・コメントは承認制になっています。
すぐにブログに反映されませんので、ご了承ください。





