椭圆曲线签名算法
椭圆曲线依赖的数学依赖的问题:k为正整数,G是椭圆曲线上的点(称为基点),k*G = Q,已知G跟Q很难算出k
实现步骤
- 产生私钥:根据随机数产生私钥
- 对明文进行Hash摘要,由私钥,Hash摘要进行椭圆曲线签名得到两个大数r跟s,r跟s转换为字节数组拼接的结果就是签名
- 将消息明文Msg,与签名发送给接收方
- 当接受方接收到数据时从签名中提取出r和s
- 对明文进行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("验证通过")
}
}
网友评论