实验目的

  • 理解非对称加密算法
  • 理解椭圆曲线算法ECC
  • 实现比特币上的椭圆曲线secp256k1算法

ECC算法流程

ECC算法中,陷门函数是定义在有限域上的二元三次曲线y^2^=x^3^+ax+b上的点所组成的阿贝尔群。

公钥:点Q

私钥:大数k

ECC算法是有限域Fp满足公式:Q=kP。

签名过程:

  • 取一个新的随机数k,令$k*G\equiv R\ mod \ N$

  • 计算S:

  • 返回签名:signature(s,r)

签名的数字为(s,r)

验签过程:

  • 计算u,v
  • 计算uG+vP
  • 判断(uG+vp).x是否和r模N同余,如果是,则签名成功

实验内容

ECC签名

func (ecc *MyECC) Sign(msg []byte, secKey *big.Int) (*Signature, error) {
	k,err :=newRand()
	if(err!=nil){
		return nil,err
	}
	R := Multi(G,k)
	r:=R.X
	r=r.Mod(r,N)
	z:=crypto.Keccak256(msg)
	z_i := new(big.Int).SetBytes(z)
	s:=new(big.Int).Mul(new(big.Int).Add(z_i,new(big.Int).Mul(r,secKey)),Inv(k,N))
	s=s.Mod(s,N)
	sig:=&Signature{s,r}
	return sig,nil
}

ECC验签

func (ecc *MyECC) VerifySignature(msg []byte, signature *Signature, pubkey *Point) bool {
	s:=signature.s
	r:=signature.r
	z:=crypto.Keccak256(msg)
	z_i := new(big.Int).SetBytes(z)
	s_inv:=Inv(s,N)
	s_inv=s_inv.Mod(s_inv,N)
	u:=new(big.Int).Mul(z_i,s_inv)
	u=u.Mod(u,N)
	v:=new(big.Int).Mul(r,s_inv)
	v=v.Mod(v,N)
	ans:=Add(Multi(G,u),Multi(pubkey,v)).X
	ans=ans.Mod(ans,N)
	return ans.Cmp(r)==0
}