楕円曲線暗号 有限体上の楕円曲線
プログラミング・ビットコイン ―ゼロからビットコインをプログラムする方法 (Jimmy Song(著)、中川 卓俊(監修)、住田 和則(監修)、中村 昭雄(監修)、星野 靖子(翻訳)、オライリー・ジャパン)の3章(楕円曲線暗号)、3.2(有限体上の楕円曲線)、練習問題1の解答をPythonではなくGoで求めてみる。
コード
package main
import (
"bitcoin/ecc"
"fmt"
"os"
)
func main() {
p := 223
b, err := ecc.NewFieldElement(7, p)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
intXY := []struct {
x, y int
}{
{192, 105},
{17, 56},
{200, 119},
{1, 193},
{42, 99},
}
for _, xy := range intXY {
x, err := ecc.NewFieldElement(xy.x, p)
if err != nil {
fmt.Println(err)
continue
}
y, err := ecc.NewFieldElement(xy.y, p)
if err != nil {
fmt.Println(err)
continue
}
l, _ := ecc.Mul(y, y)
r, _ := ecc.Mul(x, x)
r, _ = ecc.Mul(r, x)
r, _ = ecc.Add(r, b)
bln := ecc.Eq(l, r)
fmt.Println(l, r, ecc.Eq(l, r))
fmt.Printf("(%v, %v)は曲線上に", xy.x, xy.y)
if bln {
fmt.Println("ある。")
} else {
fmt.Println("ない。")
}
}
}
入出力結果
% go run ./main.go
FieldElement_223(98) FieldElement_223(98) true
(192, 105)は曲線上にある。
FieldElement_223(14) FieldElement_223(14) true
(17, 56)は曲線上にある。
FieldElement_223(112) FieldElement_223(105) false
(200, 119)は曲線上にない。
FieldElement_223(8) FieldElement_223(8) true
(1, 193)は曲線上にある。
FieldElement_223(212) FieldElement_223(59) false
(42, 99)は曲線上にない。
%