golang rsa 加密解密

发布时间:2024-07-04 23:14:52

Go语言实现RSA加密解密

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算法的复杂性和可能的安全漏洞。

相关推荐