发布时间:2024-11-22 01:25:09
RSA(Rivest-Shamir-Adleman)是一种常用的非对称加密算法,它可以用于数据加密和数字签名。在Go语言中,我们可以使用标准库中的crypto/rsa包进行RSA加密解密的操作。
首先,我们需要生成一对RSA公私钥。在Go语言中,可以使用crypto/rsa包中的GenerateKey函数生成公私钥对:
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"os"
)
func GenerateRSAKeyPair(bits int) error {
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
privateKeyFile, err := os.Create("privateKey.pem")
if err != nil {
return err
}
defer privateKeyFile.Close()
err = pem.Encode(privateKeyFile, &pem.Block{
Type: "PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(privateKey),
})
if err != nil {
return err
}
publicKey := &privateKey.PublicKey
publicKeyFile, err := os.Create("publicKey.pem")
if err != nil {
return err
}
defer publicKeyFile.Close()
err = pem.Encode(publicKeyFile, &pem.Block{
Type: "PUBLIC KEY",
Bytes: x509.MarshalPKCS1PublicKey(publicKey),
})
if err != nil {
return err
}
return nil
}
这段代码将生成一对RSA公私钥,分别保存在privateKey.pem和publicKey.pem文件中。
接下来,我们可以使用生成的公私钥进行加密解密操作。假设我们要加密的明文为"Hello, RSA!",可以使用以下代码进行加密:
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha256"
"crypto"
"encoding/base64"
"io/ioutil"
)
func EncryptRSA(plainText []byte, publicKeyFile string) (string, error) {
publicKeyData, err := ioutil.ReadFile(publicKeyFile)
if err != nil {
return "", err
}
block, _ := pem.Decode(publicKeyData)
if block == nil {
return "", err
}
publicKey, err := x509.ParsePKCS1PublicKey(block.Bytes)
if err != nil {
return "", err
}
cipherText, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, plainText, nil)
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(cipherText), nil
}
上述代码读取publicKey.pem文件,解析出公钥,然后使用EncryptOAEP函数对明文进行加密。加密后的密文以Base64编码的形式返回。
解密操作与加密操作类似,假设我们有一份密文,想要使用私钥对其进行解密,可以使用以下代码:
func DecryptRSA(cipherText string, privateKeyFile string) (string, error) {
privateKeyData, err := ioutil.ReadFile(privateKeyFile)
if err != nil {
return "", err
}
block, _ := pem.Decode(privateKeyData)
if block == nil {
return "", err
}
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "", err
}
cipherBytes, err := base64.StdEncoding.DecodeString(cipherText)
if err != nil {
return "", err
}
plainText, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, cipherBytes, nil)
if err != nil {
return "", err
}
return string(plainText), nil
}
这段代码读取privateKey.pem文件,解析出私钥,然后使用DecryptOAEP函数对密文进行解密。解密后的明文以字符串形式返回。
通过以上代码,我们可以使用Go语言实现RSA加密解密的功能。在实际应用中,我们可以使用生成的公私钥对敏感数据进行加密,然后只将加密后的数据传输给接收方,在接收方处使用私钥进行解密,以保证数据的安全性。
总结来说,Go语言提供了便利的crypto/rsa包,使得我们可以轻松地实现RSA算法的加密解密功能。通过生成一对公私钥,我们可以对敏感数据进行加密,并使用私钥解密,以保证数据的机密性和完整性。同时,使用标准库提供的函数,我们可以避免了实现RSA算法的复杂性和可能的安全漏洞。