べき乗剰余計算アルゴリズム【バイナリー法】
Posted: 2007年10月03日(水) 23:57
はじめまして☆
大学で情報セキュリティの研究室に属しています、hakuと申します。
情報セキュリティの研究室に属してはいますが、恥ずかしながら今までCをいじった経験はほとんどなく、研究の課題に苦しんでいます。
今取り組んでいるのはRSA暗号で使う、べき乗剰余計算アルゴリズムのバイナリー法をC言語で書くというものです。
以下は最も基本的なバイナリー法のアルゴリズムです。
【バイナリー法】
データのビット長をn, dのバイナリー(二進数)表現を(d[n-1],d[n-2],....d[0])とし、入力a,N,d,出力S=a^d mod Nとする。
[STEP1]S=1,j=n-1とおく。
[STEP2]j<0であればSを出力して終了し、j>=0であればSTEP3に進む。
[STEP3]S=(S*S) mod Nを計算し、STEP4へ。
[STEP4]d[j]=0のときはSTEP5に進む。d[j]=1であるときはS=(S*a) mod Nを計算し、STEP5へ。
[STEP5]j=j-1としてSTEP2に戻る。
私の研究では巨大な数のべき乗計算を扱うので、標準ライブラリ関数のpowではなく、どうしてもこのバイナリー法のアルゴリズムをC言語で書くことが必要になったのです。
自分でもやってみたのですが、10進数で与えたdの値を2進数に直したときに、STEP4の『d[j]=1であるときはS=(S*a) mod Nを計算し』というところをC言語でどのようにd[j]=1であるのか判定させ=(S*a) mod Nという計算にもっていくのか、というところがどうしてもできません。
例えば
S=3^21 mod 11のバイナリー法での計算を考えたときに、まずd=21を2進数に直すと、(10101)となりますがSTEP4に進んだときにd[j]=0なのかd[j]=1なのかをどう判定するのか、というところです。ちなみに2進数に直すときには配列を使って配列に1or0を入れていきました。
わかりにくい説明で申し訳ないのですが、よろしくお願いします。
一応、自分が考えている10進数から2進数に直すまでのプログラムを載せておきます。私はこれを使ってSTEP4のループのところを考えましたが、うまくできませんでした(>_<)
大学で情報セキュリティの研究室に属しています、hakuと申します。
情報セキュリティの研究室に属してはいますが、恥ずかしながら今までCをいじった経験はほとんどなく、研究の課題に苦しんでいます。
今取り組んでいるのはRSA暗号で使う、べき乗剰余計算アルゴリズムのバイナリー法をC言語で書くというものです。
以下は最も基本的なバイナリー法のアルゴリズムです。
【バイナリー法】
データのビット長をn, dのバイナリー(二進数)表現を(d[n-1],d[n-2],....d[0])とし、入力a,N,d,出力S=a^d mod Nとする。
[STEP1]S=1,j=n-1とおく。
[STEP2]j<0であればSを出力して終了し、j>=0であればSTEP3に進む。
[STEP3]S=(S*S) mod Nを計算し、STEP4へ。
[STEP4]d[j]=0のときはSTEP5に進む。d[j]=1であるときはS=(S*a) mod Nを計算し、STEP5へ。
[STEP5]j=j-1としてSTEP2に戻る。
私の研究では巨大な数のべき乗計算を扱うので、標準ライブラリ関数のpowではなく、どうしてもこのバイナリー法のアルゴリズムをC言語で書くことが必要になったのです。
自分でもやってみたのですが、10進数で与えたdの値を2進数に直したときに、STEP4の『d[j]=1であるときはS=(S*a) mod Nを計算し』というところをC言語でどのようにd[j]=1であるのか判定させ=(S*a) mod Nという計算にもっていくのか、というところがどうしてもできません。
例えば
S=3^21 mod 11のバイナリー法での計算を考えたときに、まずd=21を2進数に直すと、(10101)となりますがSTEP4に進んだときにd[j]=0なのかd[j]=1なのかをどう判定するのか、というところです。ちなみに2進数に直すときには配列を使って配列に1or0を入れていきました。
わかりにくい説明で申し訳ないのですが、よろしくお願いします。
一応、自分が考えている10進数から2進数に直すまでのプログラムを載せておきます。私はこれを使ってSTEP4のループのところを考えましたが、うまくできませんでした(>_<)