椭圆曲线签名

椭圆曲线签名算法

椭圆曲线依赖的数学依赖的问题:k为正整数,G是椭圆曲线上的点(称为基点),k*G = Q,已知G跟Q很难算出k

实现步骤

  1. 产生私钥:根据随机数产生私钥
  2. 对明文进行Hash摘要,由私钥,Hash摘要进行椭圆曲线签名得到两个大数r跟s,r跟s转换为字节数组拼接的结果就是签名
  3. 将消息明文Msg,与签名发送给接收方
  4. 当接受方接收到数据时从签名中提取出r和s
  5. 对明文进行Hash摘要后与公钥和r和s进行验证

对应代码

func main() {
    msg := "hello World"
    //通过椭圆曲线产生私钥
    privateKey,_ := ecdsa.GenerateKey(elliptic.P256(),rand.Reader)
    //通过私钥产生公钥
    publicKey := privateKey.PublicKey

    //对明文进行加密
    data_hash := sha256.Sum256([]byte(msg))
    r,s,err := ecdsa.Sign(rand.Reader,privateKey,data_hash[:])
    if err != nil {
        log.Panic(err)
    }

    signature := append(r.Bytes(),s.Bytes()...)

    //对签名进行验证
    r1 := big.Int{}
    s1 := big.Int{}

    siglen := len(signature)
    r1.SetBytes(signature[:(siglen/2)])
    s1.SetBytes(signature[(siglen/2):])

    isVerify := ecdsa.Verify(&publicKey,data_hash[:],&r1,&s1)
    if isVerify {
        fmt.Println("验证通过")
    }
}

你可能感兴趣的:(椭圆曲线签名)