golang 實(shí)現(xiàn)比特幣內(nèi)核之處理橢圓曲線中的天文數(shù)字
在比特幣密碼學(xué)中,我們需要處理天文數(shù)字,這個(gè)數(shù)字是如此巨大,以至于它很容易超出我們宇宙中原子的總數(shù),也許 64 位的值不足以表示這個(gè)數(shù)字,而像加、乘、冪這樣的操作如果使用 64 位整數(shù)會(huì)導(dǎo)致溢出,因此我們可能需要借助 golang 的 big 包,我們將通過(guò)使用 big.Int 來(lái)表示其值字段來(lái)更改 FieldNumber 的代碼,代碼將如下所示:
package elliptic_curve import ( "fmt" "math/big" ) //using big package to deal with Astronomical figures type FieldElement struct { order *big.Int //field order num *big.Int //value of the given element in the field } func NewFieldElement(order *big.Int, num *big.Int) *FieldElement { /* constructor for FieldElement, its the __init__ if you are from python */ if order.Cmp(num) == -1 { err := fmt.Sprintf("Num not in the range from 0 to %v", order) panic(err) } return &FieldElement{ order: order, num: num, } } func (f *FieldElement) String() string { //format the object to printable string //its __repr__ if you are from python return fmt.Sprintf("FieldElement{order: %v, num: %v}", *f.order, *f.num) } func (f *FieldElement) EqualTo(other *FieldElement) bool { /* two field element is equal if their order and value are equal */ return f.order.Cmp(other.order) == 0 && f.num.Cmp(other.num) == 0 } func (f *FieldElement) checkOrder(other *FieldElement) { if f.order.Cmp(other.order) != 0 { panic("add need to do on field element with the same order") } } func (f *FieldElement) Add(other *FieldElement) *FieldElement { f.checkOrder(other) //remember to do the modulur var op big.Int return NewFieldElement(f.order, op.Mod(op.Add(f.num, other.num), f.order)) } func (f *FieldElement) Negate() *FieldElement { /* for a field element a, its negate is another element b in field such that (a + b) % order= 0(remember the modulur over order), because the value of element in the field are smaller than its order, we can easily get the negate of a by order - a, */ var op big.Int return NewFieldElement(f.order, op.Sub(f.order, f.num)) } func (f *FieldElement) Subtract(other *FieldElement) *FieldElement { //first find the negate of the other //add this and the negate of the other return f.Add(other.Negate()) } func (f *FieldElement) Multiply(other *FieldElement) *FieldElement { f.checkOrder(other) //multiplie over modulur of order var op big.Int mul := op.Mul(f.num, other.num) return NewFieldElement(f.order, op.Mod(mul, f.order)) } func (f *FieldElement) Power(power *big.Int) *FieldElement { var op big.Int powerRes := op.Exp(f.num, power, nil) modRes := op.Mod(powerRes, f.order) return NewFieldElement(f.order, modRes) } func (f *FieldElement) ScalarMul(val *big.Int) *FieldElement { var op big.Int res := op.Mul(f.num, val) res = op.Mod(res, f.order) return NewFieldElement(f.order, res) }
現(xiàn)在我們需要確保這些更改不會(huì)破壞我們的邏輯,讓我們?cè)俅芜\(yùn)行測(cè)試,在 main.go 中,我們有以下代碼:
package main import ( ecc "elliptic_curve" "fmt" "math/big" "math/rand" ) func SolveField19MultiplieSet() { //randomly select a num from (1, 18) min := 1 max := 18 k := rand.Intn(max-min) + min fmt.Printf("randomly select k is : %d\n", k) element := ecc.NewFieldElement(big.NewInt(19), big.NewInt(int64(k))) for i := 0; i < 19; i++ { fmt.Printf("element %d multiplie with %d is %v\n", k, i, element.ScalarMul(big.NewInt(int64(i)))) } } func main() { f44 := ecc.NewFieldElement(big.NewInt(57), big.NewInt(44)) f33 := ecc.NewFieldElement(big.NewInt(57), big.NewInt(33)) // 44 + 33 equal to (44+33) % 57 is 20 res := f44.Add(f33) fmt.Printf("field element 44 add to field element 33 is : %v\n", res) //-44 is the negate of field element 44, which is 57 - 44 = 13 fmt.Printf("negate of field element 44 is : %v\n", f44.Negate()) fmt.Printf("field element 44 - 33 is : %v\n", f44.Subtract(f33)) fmt.Printf("field element 33 - 44 is : %v\n", f33.Subtract(f44)) //it is easy to check (11+33)%57 == 44 //check (46 + 44) % 57 == 33 fmt.Printf("check 46 + 44 over modulur 57 is %d\n", (46+44)%57) //check by field element f46 := ecc.NewFieldElement(big.NewInt(57), big.NewInt(46)) fmt.Printf("field element 46 + 44 is %v\n", f46.Add(f44)) SolveField19MultiplieSet() }
運(yùn)行上述代碼將獲得以下結(jié)果:
field element 44 add to field element 33 is : FieldElement{order: 57, num: 20}
negate of field element 44 is : FieldElement{order: 57, num: 13}
field element 44 - 33 is : FieldElement{order: 57, num: 11}
field element 33 - 44 is : FieldElement{order: 57, num: 46}
check 46 + 44 over modulur 57 is 33
field element 46 + 44 is FieldElement{order: 57, num: 33}
randomly select k is : 2
element 2 multiplie with 0 is FieldElement{order: 19, num: 0}
element 2 multiplie with 1 is FieldElement{order: 19, num: 2}
element 2 multiplie with 2 is FieldElement{order: 19, num: 4}
element 2 multiplie with 3 is FieldElement{order: 19, num: 6}
element 2 multiplie with 4 is FieldElement{order: 19, num: 8}
element 2 multiplie with 5 is FieldElement{order: 19, num: 10}
element 2 multiplie with 6 is FieldElement{order: 19, num: 12}
element 2 multiplie with 7 is FieldElement{order: 19, num: 14}
element 2 multiplie with 8 is FieldElement{order: 19, num: 16}
element 2 multiplie with 9 is FieldElement{order: 19, num: 18}
element 2 multiplie with 10 is FieldElement{order: 19, num: 1}
element 2 multiplie with 11 is FieldElement{order: 19, num: 3}
element 2 multiplie with 12 is FieldElement{order: 19, num: 5}
element 2 multiplie with 13 is FieldElement{order: 19, num: 7}
element 2 multiplie with 14 is FieldElement{order: 19, num: 9}
element 2 multiplie with 15 is FieldElement{order: 19, num: 11}
element 2 multiplie with 16 is FieldElement{order: 19, num: 13}
element 2 multiplie with 17 is FieldElement{order: 19, num: 15}
element 2 multiplie with 18 is FieldElement{order: 19, num: 17}
通過(guò)檢查結(jié)果,我們可以確保 FieldElement 中的更改不會(huì)破壞我們之前的邏輯?,F(xiàn)在讓我們考慮以下問(wèn)題:
p = 7, 11, 17, 19, 31,以下集合會(huì)是什么:
{1 ^(p-1), 2 ^ (p-1), … (p-1)^(p-1)}
讓我們?cè)?main.go 中編寫(xiě)代碼來(lái)解決它:
func ComputeFieldOrderPower() { orders := []int{7, 11, 17, 31} for _, p := range orders { fmt.Printf("value of p is: %d\n", p) for i := 1; i < p; i++ { elm := ecc.NewFieldElement(big.NewInt(int64(p)), big.NewInt(int64(i))) fmt.Printf("for element: %v, its power of p - 1 is: %v\n", elm, elm.Power(big.NewInt(int64(p-1)))) } fmt.Println("-------------------------------") } } func main() { ComputeFieldOrderPower() }
結(jié)果如下:
value of p is: 7
for element: FieldElement{order: 7, num: 1}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 2}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 3}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 4}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 5}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 6}, its power of p - 1 is: FieldElement{order: 7, num: 1}
-------------------------------
value of p is: 11
for element: FieldElement{order: 11, num: 1}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 2}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 3}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 4}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 5}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 6}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 7}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 8}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 9}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 10}, its power of p - 1 is: FieldElement{order: 11, num: 1}
-------------------------------
value of p is: 17
for element: FieldElement{order: 17, num: 1}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 2}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 3}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 4}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 5}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 6}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 7}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 8}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 9}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 10}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 11}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 12}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 13}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 14}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 15}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 16}, its power of p - 1 is: FieldElement{order: 17, num: 1}
-------------------------------
value of p is: 31
for element: FieldElement{order: 31, num: 1}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 2}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 3}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 4}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 5}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 6}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 7}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 8}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 9}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 10}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 11}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 12}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 13}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 14}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 15}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 16}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 17}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 18}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 19}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 20}, its power of p - 1 is: FieldElement{order: 31, num: 1}
my@MACdeMacBook-Air bitcoin % go run main.go
value of p is: 7
for element: FieldElement{order: 7, num: 1}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 2}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 3}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 4}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 5}, its power of p - 1 is: FieldElement{order: 7, num: 1}
for element: FieldElement{order: 7, num: 6}, its power of p - 1 is: FieldElement{order: 7, num: 1}
-------------------------------
value of p is: 11
for element: FieldElement{order: 11, num: 1}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 2}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 3}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 4}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 5}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 6}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 7}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 8}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 9}, its power of p - 1 is: FieldElement{order: 11, num: 1}
for element: FieldElement{order: 11, num: 10}, its power of p - 1 is: FieldElement{order: 11, num: 1}
-------------------------------
value of p is: 17
for element: FieldElement{order: 17, num: 1}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 2}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 3}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 4}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 5}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 6}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 7}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 8}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 9}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 10}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 11}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 12}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 13}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 14}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 15}, its power of p - 1 is: FieldElement{order: 17, num: 1}
for element: FieldElement{order: 17, num: 16}, its power of p - 1 is: FieldElement{order: 17, num: 1}
-------------------------------
value of p is: 19
for element: FieldElement{order: 19, num: 1}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 2}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 3}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 4}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 5}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 6}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 7}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 8}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 9}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 10}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 11}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 12}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 13}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 14}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 15}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 16}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 17}, its power of p - 1 is: FieldElement{order: 19, num: 1}
for element: FieldElement{order: 19, num: 18}, its power of p - 1 is: FieldElement{order: 19, num: 1}
-------------------------------
value of p is: 31
for element: FieldElement{order: 31, num: 1}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 2}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 3}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 4}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 5}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 6}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 7}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 8}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 9}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 10}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 11}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 12}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 13}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 14}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 15}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 16}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 17}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 18}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 19}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 20}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 21}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 22}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 23}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 24}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 25}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 26}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 27}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 28}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 29}, its power of p - 1 is: FieldElement{order: 31, num: 1}
for element: FieldElement{order: 31, num: 30}, its power of p - 1 is: FieldElement{order: 31, num: 1}
-------------------------------
你可以看到集合中的所有元素都是1,無(wú)論字段的順序如何,這意味著對(duì)于任何有限字段中的任意元素k和順序p,我們會(huì)有:
k ^(p-1) % p == 1
這是一個(gè)重要結(jié)論,我們將在后續(xù)視頻中使用它來(lái)驅(qū)動(dòng)我們的加密算法。
有限域元素上最難的操作是除法,我們有乘法操作,對(duì)于字段中的元素3和7(順序?yàn)?9),它們的乘積是(3 * 7) % 19 = 2?,F(xiàn)在給定兩個(gè)字段元素2和7,我們?nèi)绾蔚玫??我們定義一個(gè)除法操作,它是乘法的逆運(yùn)算,即2 / 7 = 3,這相當(dāng)直觀。這里我們需要確保分母不是0。
記住在有限的定義中,如果a在字段中,那么還有一個(gè)b在字段中,使得a * b = 1。對(duì)于3 7 = 2(注意表示模順序的乘法),如果我們能找到b,使得b * 7 = 1,那么我們就會(huì)有3 * 7 * b = 2 * b => 3 * (7 * b) = 2 * b => 3 = 2 * b,這意味著2 / 7是2乘以b的結(jié)果,b. 也就是說(shuō),如果我們想做除法a / b,我們可以找到b的乘法逆元,稱之為c,并使用c與模順序相乘。
現(xiàn)在問(wèn)題來(lái)了,我們?nèi)绾握业絙的乘法逆元?記住我們上面的問(wèn)題嗎?b ^ (p - 1) % p = 1 => b * b ^(p-2) % p = 1 => b的乘法逆元是b ^ (p-2)。
如果你不能確定為什么對(duì)于給定元素b在字段中且b^(p-1) % p = 1,我們有一個(gè)小代碼片段來(lái)獲得結(jié)果,我們需要使其數(shù)學(xué)上穩(wěn)固,然后我們就有了它的證明,結(jié)論b^(p-1) % p = 1被稱為費(fèi)馬小定理:
對(duì)于任何字段元素k(k!=0)和順序p,我們有{1, 2, 3 …, p-1} <=> {k 1 % p, …, k (p-1) %p} =>
[1 2 3… (p-1)] % p == (k1) (k2) … (k* (p-1)) % p = k^(p-1) * [1 2 … p-1] % p,兩邊消去[12…p-1]我們得到1 % p == k ^(p-1) % p => 1 == k^(p-1)%p
現(xiàn)在讓我們看看如何使用代碼實(shí)現(xiàn)除法操作:
func (f *FieldElement) Multiply(other *FieldElement) *FieldElement { f.checkOrder(other) // 模順序進(jìn)行乘法 var op big.Int mul := op.Mul(f.num, other.num) return NewFieldElement(f.order, op.Mod(mul, f.order)) }
因?yàn)閎 ^ (p - 1) % p = 1,所以當(dāng)我們計(jì)算字段元素k的T次方時(shí),我們可以優(yōu)化為首先獲取t = T % (p-1),然后計(jì)算k^(t) % p,這里是代碼:
func (f *FieldElement) Power(power *big.Int) *FieldElement { /* k ^ (p-1) % p = 1,我們可以計(jì)算t = power % (p-1) 然后k ^ power % p == k ^ t %p */ var op big.Int t := op.Mod(power, op.Sub(f.order, big.NewInt(int64(1)))) powerRes := op.Exp(f.num, t, nil) modRes := op.Mod(powerRes, f.order) return NewFieldElement(f.order, modRes) }
現(xiàn)在我們可以在main.go中檢查我們的代碼:
package main import ( ecc "elliptic_curve" "fmt" "math/big" "math/rand" ) func main() { f2 := ecc.NewFieldElement(big.NewInt(int64(19)), big.NewInt(int64(2))) f7 := ecc.NewFieldElement(big.NewInt(int64(19)), big.NewInt(int64(7))) fmt.Printf("field element 2 / 7 with order 19 is %v\n", f2.Divide(f7)) f46 := ecc.NewFieldElement(big.NewInt(57), big.NewInt(46)) fmt.Printf("field element 46 * 46 with order 57: %v\n", f46.Multiply(f46)) fmt.Printf("field element 46 ^ (58) is %v\n", f46.Power(big.NewInt(int64(58)))) }
運(yùn)行上述代碼我們得到以下結(jié)果:
field element 2 / 7 with order 19 is FieldElement{order: 19, num: 3}
field element 46 * 46 with order 57: FieldElement{order: 57, num: 7}
field element 46 ^ (58) is FieldElement{order: 57, num: 7}
這正是我們所期望的,這就是字段元素的實(shí)現(xiàn)。
到此這篇關(guān)于golang 實(shí)現(xiàn)比特幣內(nèi)核:處理橢圓曲線中的天文數(shù)字的文章就介紹到這了,更多相關(guān)golang比特幣內(nèi)核內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言中Redis緩存與本地內(nèi)存緩存實(shí)戰(zhàn)
在現(xiàn)代高并發(fā)系統(tǒng)中,緩存技術(shù)是提升性能和降低數(shù)據(jù)庫(kù)壓力的關(guān)鍵手段,本文將為大家介紹一下Redis緩存與本地內(nèi)存緩存的具體應(yīng)用,需要的可以了解下2025-03-03一文搞懂Go語(yǔ)言中defer關(guān)鍵字的使用
defer是golang中用的比較多的一個(gè)關(guān)鍵字,也是go面試題里經(jīng)常出現(xiàn)的問(wèn)題。今天就來(lái)整理一下關(guān)于defer的學(xué)習(xí)使用,希望對(duì)需要的朋友有所幫助2022-09-09使用client-go工具調(diào)用kubernetes API接口的教程詳解(v1.17版本)
這篇文章主要介紹了使用client-go工具調(diào)kubernetes API接口(v1.17版本),本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù)
這篇文章主要介紹了用Go+WebSocket快速實(shí)現(xiàn)一個(gè)chat服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Golang使用Gin框架實(shí)現(xiàn)HTTP上傳文件過(guò)程介紹
由于需求中有文件上傳這一個(gè)需求,在這里我們就學(xué)習(xí)一下go語(yǔ)言如何上傳文件。本文主要通過(guò)表單的方式進(jìn)行文件上傳操作,本文實(shí)例為大家分享了Go實(shí)現(xiàn)文件上傳操作的具體代碼,供大家參考,具體內(nèi)容如下2023-04-04