計算機科学のブログ

楕円曲線暗号 有限体上の楕円曲線

プログラミング・ビットコイン ―ゼロからビットコインをプログラムする方法 (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)は曲線上にない。
%