椭圆曲线签名

椭圆曲线签名算法 【椭圆曲线签名】椭圆曲线依赖的数学依赖的问题: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("验证通过") } }

    推荐阅读