最近,卒研の関係で楕円曲線暗号の勉強をしている.
その勉強のまとめをここに吐き出しておきたい.
個人のまとめなので,内容に不備があろうとも責任を負う事はできない.
教科書としては『楕円曲線暗号入門』を使用している.
とても良い資料なので,この資料を読みつつ独自にC言語でプログラムを書いていく予定.
まずは,有限体Fpについて.
有限体Fp上では,その要素a,bの加算は(a+b) mod pとなる.
減算も同様に(a-b) mod pとなる.
int add(int a,int b,int p){
return (a+b)%p;
}
なお,a<0については a = a+p = a+p+p = a+p+p+p =…
p-1<bについてはb = b-p = b-p-p = b-p-p-p =…
と続けていくと0からp-1の範囲で計算することができる.
int sub(int a,int b,int p){
int res=a-b;
while(res<0||p<res){
if(res<0){
res+=p;
}else{
res-=p;
}
}
return res;
}
乗算は加算と同様に(a*b) mod pとなる.
乗算については,a/b=(a+p)/b=(a+p+p)/b=…
と変形できるので,割り切れた値を用いる.
int mul(int a,int b,int p){
return (a*b)%p;
}
int divi(int a,int b,int p){
if(b==0){
return -1;
}
while(a%b!=0){
a+=p;
}
return a/b;
}
ソースコード
※除算の関数名をdiviとしているのは,stdlibの中で既にdiv関数が定義されているため.