在Go语言中,常见的数字签名算法包括HS(HMAC-SHA)、RS(RSA)和ES(ECDSA)。其中,HS和RS是非对称加密算法,ED则是基于椭圆曲线的数字签名算法。
下面分别介绍这些数字签名算法在Go语言中的实现方式。
- 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)
}
- 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
}
- 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)
}
- 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)
}




