Golang crypto.rsa 包详解
crypto/rsa
包提供了RSA加密算法的实现。RSA是一种非对称加密算法,可以用于加密和数字签名。
以下是一些主要的函数和类型:
func GenerateKey(bits int) (*PrivateKey, error)
: 生成一个新的私钥。type PublicKey struct{}
: 公钥,用于加密。type PrivateKey struct{}
: 私钥,用于解密和签名。func (priv *PrivateKey) Public() *PublicKey
: 从私钥获取公钥。func (pub *PublicKey) Size() int
: 返回公钥的大小,以字节为单位。func EncryptValue(rand io.Reader, pub *PublicKey, b []byte) (*EncryptedValue, error)
: 使用公钥加密字节切片。func DecryptValue(priv *PrivateKey, b []byte) ([]byte, error)
: 使用私钥解密字节切片。func SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)
: 使用SHA1或SHA256哈希算法用私钥进行PKCS#1 v1.5签名。func VerifyPKCS1v15(pub *PublicKey, hash []byte, sig []byte) error
: 使用SHA1或SHA256哈希算法验证PKCS#1 v1.5签名。
示例代码:
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"fmt"
"log"
)
func main() {
// 生成私钥
privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
log.Fatal(err)
}
// 公钥
publicKey := &privateKey.PublicKey
// 原始数据
data := []byte("Hello, RSA!")
// 使用公钥加密
encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, data)
if err != nil {
log.Fatal(err)
}
// 使用私钥解密
decryptedData, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, encryptedData)
if err != nil {
log.Fatal(err)
}
// 输出结果
fmt.Printf("Decrypted data: %s\n", decryptedData)
// 创建哈希值
h := sha256.New()
h.Write(data)
hashed := h.Sum(nil)
// 使用私钥签名
signedData, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
if err != nil {
log.Fatal(err)
}
// 验证签名
err = rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed, signedData)
if err != nil {
log.Fatal(err)
}
fmt.Println("Signature verified")
}
这段代码展示了如何生成一个私钥和公钥对,如何使用公钥加密数据,如何使用私钥解密数据,如何创建一个哈希值并用私钥对其进行签名,以及如何验证签名。
评论已关闭