golang实现rsa加密

发布时间:2024-07-02 21:33:55

使用Golang实现RSA加密

在网络通信中,安全性是非常重要的。RSA加密算法是一种非对称加密算法,可以用于数据加密和数字签名。本文将介绍如何使用Golang实现RSA加密。

首先,我们需要生成RSA密钥对。在Golang中,可以使用crypto包下的rsa.GenerateKey函数来生成密钥对:

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/pem"
	"os"
)

func main() {
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		panic(err)
	}

	privateKeyFile, err := os.Create("private_key.pem")
	if err != nil {
		panic(err)
	}
	defer privateKeyFile.Close()

	privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
	privateKeyPem := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: privateKeyBytes})
	privateKeyFile.Write(privateKeyPem)

	publicKey := privateKey.PublicKey

	publicKeyFile, err := os.Create("public_key.pem")
	if err != nil {
		panic(err)
	}
	defer publicKeyFile.Close()

	publicKeyBytes, err := x509.MarshalPKIXPublicKey(&publicKey)
	if err != nil {
		panic(err)
	}
	publicKeyPem := pem.EncodeToMemory(&pem.Block{Type: "RSA PUBLIC KEY", Bytes: publicKeyBytes})
	publicKeyFile.Write(publicKeyPem)
}

上述代码会生成一个私钥文件private_key.pem和一个公钥文件public_key.pem。私钥用于对数据进行加密,公钥用于对加密后的数据进行解密。

接下来,我们使用生成的密钥对进行加密和解密。下面是一个使用RSA加密算法对数据进行加密的示例:

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"fmt"
)

func main() {
	message := []byte("Hello, RSA")

	publicKeyPem := []byte(`
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5EPdi5VmQk8JYriTEZfb
DStvjw3GngDVlmO/iXr+25V6qOwsfmRVHKqx239ooFPAIoESs+WRAdzI5gZ2AOL4
1da6NEOpEBqCUxPPrhWCKnrD/t2CBGetixtSJ6ltUmyVHKBbeT6gy4vQK826sreI
GXts0qMJF7TZIpjj773phAXjS4Eo7QEwVN6ZymsnXd4OSXhryRD28GKjwdtsVcxu
mtgoH3AMf6Undi5ARFR3HSxf6TCNldbjnHNZHiJ7UD1QrqopFX2KznGpry2YfI+W
z0XicCnuqwkaJBRe2hxTQFOrLmVNZJAggTHuD181c7EPla++pFon5ck/F2fWMEC7
SQIDAQAB
-----END PUBLIC KEY-----
`)

	block, _ := pem.Decode(publicKeyPem)
	if block == nil {
		panic("failed to parse PEM block containing the public key")
	}

	publicKey, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		panic(err)
	}

	rsaPublicKey, ok := publicKey.(*rsa.PublicKey)
	if !ok {
		panic("failed to get RSA public key")
	}

	ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, rsaPublicKey, message)
	if err != nil {
		panic(err)
	}

	fmt.Println(base64.StdEncoding.EncodeToString(ciphertext))
}

上述代码中,我们将公钥内容放在一个字符串变量publicKeyPem中,然后通过base64.StdEncoding对加密后的数据进行编码输出。

使用RSA算法对数据进行解密的示例代码如下:

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"fmt"
)

func main() {
	ciphertext, _ := base64.StdEncoding.DecodeString("...")
	
	privateKeyPem := []byte(`
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDkQ92LlWZCTwli
uJMxGX2w0rb48Nxp4A1ZZjv4l6/tuVeqjsLH5kVRyrPbf2igU8AigRKz5ZEB3Mjm
BnYAsvjV1ro0Q6kQGpJTE8+uFYIqe
-----END PRIVATE KEY-----
`)

	block, _ := pem.Decode(privateKeyPem)
	if block == nil {
		panic("failed to parse PEM block containing the private key")
	}

	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		panic(err)
	}

	plaintext, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(plaintext))
}

上述代码中,我们将密文通过base64.StdEncoding进行解码,然后使用解密的私钥对密文进行解密,并输出明文。

到此为止,我们已经成功地使用Golang实现了RSA加密算法。使用RSA加密可以保证通信数据的安全性,防止被第三方窃取或篡改。

相关推荐