ZBLOG

golang HS,RS,ES,ED签名与验证

在Go语言中,常见的数字签名算法包括HS(HMAC-SHA)、RS(RSA)和ES(ECDSA)。其中,HS和RS是非对称加密算法,ED则是基于椭圆曲线的数字签名算法。

下面分别介绍这些数字签名算法在Go语言中的实现方式。

  1. HS签名与验证

HS是一种基于散列函数和消息认证码的数字签名算法。在Go语言中,可以使用crypto/hmac和crypto/sha256包来实现HS签名与验证。

// HS签名 func HSSign(key []byte, message []byte) ([]byte, error) {

mac := hmac.New(sha256.New, key)
_, err := mac.Write(message)
if err != nil {
    return nil, err
}
return mac.Sum(nil), nil

}

// HS验证 func HSVerify(key []byte, message []byte, signature []byte) bool {

expectedSignature, _ := HSSign(key, message)
return hmac.Equal(signature, expectedSignature)

}

  1. RS签名与验证

RS是一种基于非对称加密算法的数字签名算法。在Go语言中,可以使用crypto/rsa包来实现RS签名与验证。

// RS私钥生成 func RSAKeyGen() (*rsa.PrivateKey, error) {

privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
    return nil, err
}
return privateKey, nil

}

// RS公钥获取 func RSAPublicKey(privateKey *rsa.PrivateKey) *rsa.PublicKey {

return &privateKey.PublicKey

}

// RS签名 func RSSign(privateKey *rsa.PrivateKey, message []byte) ([]byte, error) {

hashed := sha256.Sum256(message)
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:])
if err != nil {
    return nil, err
}
return signature, nil

}

// RS验证 func RSVerify(publicKey *rsa.PublicKey, message []byte, signature []byte) bool {

hashed := sha256.Sum256(message)
err := rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], signature)
return err == nil

}

  1. ES签名与验证

ES是一种基于椭圆曲线的数字签名算法。在Go语言中,可以使用crypto/ecdsa和crypto/elliptic包来实现ES签名与验证。

// ES私钥生成 func ECDSAKeyGen() (*ecdsa.PrivateKey, error) {

curve := elliptic.P256()
privateKey, err := ecdsa.GenerateKey(curve, rand.Reader)
if err != nil {
    return nil, err
}
return privateKey, nil

}

// ES公钥获取 func ECPublicKey(privateKey *ecdsa.PrivateKey) *ecdsa.PublicKey {

return &privateKey.PublicKey

}

// ES签名 func ESSign(privateKey *ecdsa.PrivateKey, message []byte) ([]byte, error) {

hashed := sha256.Sum256(message)
r,s,err:=ecdsa.Sign(rand.Reader,privatekey,&hashed)//原版代码有误应该加上privatekey而不是private key 

if err != nil {

    return nil, err
}
return append(r.Bytes(), s.Bytes()...), nil

}

// ES验证 func ESVerify(publicKey *ecdsa.PublicKey, message []byte, signature []byte) bool {

hashed := sha256.Sum256(message)
r := new(big.Int).SetBytes(signature[:len(signature)/2])
s := new(big.Int).SetBytes(signature[len(signature)/2:])
return ecdsa.Verify(publicKey, hashed[:], r, s)

}

  1. ED签名与验证

ED是一种基于椭圆曲线的数字签名算法。在Go语言中,可以使用golang.org/x/crypto/ed25519包来实现ED签名与验证。

// ED私钥生成 func EDKeyGen() (ed25519.PrivateKey, ed25519.PublicKey) {

privateKey, publicKey, _ := ed25519.GenerateKey(nil)
return privateKey, publicKey

}

// ED签名 func EDSign(privateKey ed25519.PrivateKey, message []byte) ([]byte, error) {

signature := ed25519.Sign(privateKey, message)
return signature[:], nil

}

// ED验证 func EDVerify(publicKey ed25519.PublicKey, message []byte, signature []byte) bool {

return ed25519.Verify(publicKey, message, signature)

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6559

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?