以下是一个使用Go语言的RSA加密、解密、签名和验签的例子:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
)
func main() {
// 生成一对RSA公私钥
privKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
panic(err)
}
// 要加密的明文
plainText := []byte("Hello RSA!")
// 使用公钥加密明文
cipherText, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, &privKey.PublicKey, plainText, nil)
if err != nil {
panic(err)
}
fmt.Printf("Cipher text: %x\n", cipherText)
// 使用私钥解密密文
decryptedPlainText, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privKey, cipherText, nil)
if err != nil {
panic(err)
}
fmt.Printf("Decrypted plain text: %s\n", decryptedPlainText)
// 签名消息
hashed := sha256.Sum256([]byte("message to be signed"))
signature, err := rsa.SignPKCS1v15(rand.Reader, privKey, crypto.SHA256, hashed[:])
if err != nil {
panic(err)
}
fmt.Printf("Signature: %x\n", signature)
// 验证签名
err = rsa.VerifyPKCS1v15(&privKey.PublicKey, crypto.SHA256, hashed[:], signature)
if err != nil {
panic(err)
}
}
在这个例子中,我们使用rsa.GenerateKey()
函数生成一对RSA公私钥,并使用rsa.EncryptOAEP()
函数使用公钥加密明文。然后,我们使用私钥解密密文并将其打印出来。
接下来,我们使用sha256.Sum256()
函数计算消息的哈希值,并使用rsa.SignPKCS1v15()
函数用私钥签名该哈希值。最后,我们使用rsa.VerifyPKCS1v15()
函数验证签名是否正确。
注意,在生产环境中,请确保适当地保护您的RSA私钥,以防止任何人访问它。