golang 公钥加密

发布时间:2024-07-07 17:45:17

在当今的信息时代,数据的安全性是一项重要而又不可忽视的任务。公钥加密技术作为一种广泛应用于数据传输和存储领域的安全方案,为保护敏感信息提供了一种可靠的解决方案。而在Golang开发中,公钥加密的应用也是非常常见的。本文将介绍如何使用Golang进行公钥加密。

生成密钥对

在使用Golang进行公钥加密前,首先需要生成公钥和私钥的密钥对。Golang提供了丰富的加密库,可以轻松实现这一步骤。我们可以使用RSA算法来生成密钥对,示例代码如下:

package main

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

func main() {
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		fmt.Println("Failed to generate private key")
		os.Exit(1)
	}

	privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)
	privateKeyPEM := pem.EncodeToMemory(&pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privateKeyBytes,
	})
	fmt.Println(string(privateKeyPEM))

	publicKey := &privateKey.PublicKey
	publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)
	if err != nil {
		fmt.Println("Failed to get public key")
		os.Exit(1)
	}

	publicKeyPEM := pem.EncodeToMemory(&pem.Block{
		Type:  "RSA PUBLIC KEY",
		Bytes: publicKeyBytes,
	})
	fmt.Println(string(publicKeyPEM))
}

运行上述代码后,即可在控制台输出私钥和公钥的PEM格式字符串。这样,我们就成功地生成了Golang中用于公钥加密的密钥对。

加密数据

生成密钥对之后,我们就可以使用公钥对数据进行加密。Golang提供了crypto/rsa包来实现RSA加密算法。下面是一个简单的示例代码:

package main

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

func main() {
	data := []byte("Hello, World!")

	pubKeyPEM := []byte(`-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAw5C+WUIZr9KqEOhWYzXl8/V3dbf0T2WC4nVvQCvR4BpzckT71LFC
EHL7/FdqsaiqzAuDGLyTbsJa3BpKws+BtmtPCkvzJeEmmOLORI0byvW6Qk0/JMM7
nIoMl+TDbOGCLuzkbPvzj/mZ2guU4+pJOmhNZDFMgsumaS4zMNcJG15YLgccEGVX
...
-----END RSA PUBLIC KEY-----`)

	block, _ := pem.Decode(pubKeyPEM)
	if block == nil {
		fmt.Println("Failed to decode public key")
		os.Exit(1)
	}

	pubKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		fmt.Println("Failed to parse public key")
		os.Exit(1)
	}

	pubKey := pubKeyInterface.(*rsa.PublicKey)
	ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pubKey, data)
	if err != nil {
		fmt.Println("Failed to encrypt data")
		os.Exit(1)
	}

	encryptedData := base64.StdEncoding.EncodeToString(ciphertext)
	fmt.Println(encryptedData)
}

将需要加密的数据替换为自己的数据,pubKeyPEM替换为实际的公钥PEM格式字符串后,运行代码即可得到经过加密的数据。此时生成的encryptedData就是加密后的数据,可以用于传输和存储。

解密数据

在接收到加密数据后,我们可以使用私钥对其进行解密。下面是一个简单的解密示例代码:

package main

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

func main() {
	encryptedData := "..."
	privateKeyPEM := []byte(`-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAw5C+WUIZr9KqEOhWYzXl8/V3dbf0T2WC4nVvQCvR4BpzckT7
1LFCEHL7/FdqsaiqzAuDGLyTbsJa3BpKws+BtmtPCkvzJeEmmOLORI0byvW6Qk0/
JMM7nIoMl+TDbOGCLuzkbPvzj/mZ2guU4+pJOmhNZDFMgsumaS4zMNcJG15YLgcc
...
-----END RSA PRIVATE KEY-----`)

	block, _ := pem.Decode(privateKeyPEM)
	if block == nil {
		fmt.Println("Failed to decode private key")
		os.Exit(1)
	}

	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		fmt.Println("Failed to parse private key")
		os.Exit(1)
	}

	ciphertext, _ := base64.StdEncoding.DecodeString(encryptedData)
	decryptedData, err := rsa.DecryptPKCS1v15(nil, privateKey, ciphertext)
	if err != nil {
		fmt.Println("Failed to decrypt data")
		os.Exit(1)
	}

	fmt.Println(string(decryptedData))
}

将接收到的加密数据替换为实际的数据,privateKeyPEM替换为实际的私钥PEM格式字符串后,运行代码即可得到解密后的数据。此时生成的decryptedData就是解密后的数据。

通过以上三个步骤,我们可以在Golang开发中轻松实现公钥加密。生成密钥对、加密数据和解密数据分别使用了不同的函数和技术,确保了数据的安全性和可靠性。在实际的应用中,我们可以根据具体的需求和情况,灵活地选择适合自己的加密方案,并结合Golang的强大功能和丰富的加密库来保护敏感信息。

相关推荐