侯博文PB20000054
完成签名和验签对应的函数部分
type ECC interface {
    Sign(msg []byte, secKey *big.Int) (*Signature, error)
    VerifySignature(msg []byte, signature *Signature, pubkey *Point) bool
}
代码部分如下
func (ecc *MyECC) Sign(msg []byte, secKey *big.Int) (*Signature, error) {
     // 计算消息的哈希值,用于生成签名
     z := crypto.Keccak256(msg)
     zInt := new(big.Int).SetBytes(z)
    // 生成随机数 k
    k, err := newRand()
    if err != nil {
	return nil, err
    }
    // 计算 kG
    P1 := Multi(G,k)
    r := P1.X
    // 计算 k^-1
    kInv := Inv(k, N)
    // 计算 s = (h + xr) / k
    xr := new(big.Int).Mul(secKey, r)       //xr
    zInt.Add(zInt, xr)                      //h+xr
    s := new(big.Int).Mul(kInv, zInt)       //(h + xr) / k
    s.Mod(s, N)                             //(h + xr) / k(mod N)
    // 生成签名对象
    if s != nil {
	return &Signature{s: s, r: r}, nil
    }
    return nil, fmt.Errorf("error generating signature")
}
代码实现如下:
func (ecc *MyECC) VerifySignature(msg []byte, signature *Signature, pubkey *Point) bool {
    // Step 1: 计算哈希值 z
    z := crypto.Keccak256(msg)
    zInt := new(big.Int).SetBytes(z)
    // Step 2: 计算参数 u = z / s, v = r / s
    sInv := new(big.Int).ModInverse(signature.s, N)
    u := new(big.Int).Mul(zInt, sInv)
    u.Mod(u, N)
    v := new(big.Int).Mul(signature.r, sInv)
    v.Mod(v, N)
    // Step 3: 计算点 R = u*G + v*P
    R := Add(Multi(G, u), Multi(pubkey, v))
    // Step 4: 验签
	    return R.X.Cmp(signature.r) == 0
}