golang rsa 加密 md5

发布时间:2024-12-23 04:48:29

Golang RSA加密MD5

本文将介绍如何使用Golang进行RSA加密和MD5哈希的操作。RSA和MD5都是常用的加密算法,它们可以用于保护数据的机密性和完整性。

RSA加密

RSA是一种非对称加密算法,它使用一对密钥:公钥和私钥。公钥用于加密数据,而私钥用于解密数据。在Golang中,我们可以使用`crypto/rsa`包来实现RSA加密。

首先,我们需要生成RSA密钥对:

package main

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

func generateRSAKeyPair() (*rsa.PrivateKey, error) {
	privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
	if err != nil {
		return nil, err
	}
	return privateKey, nil
}

func savePrivateKey(key *rsa.PrivateKey, filename string) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()
	privateKeyBytes := x509.MarshalPKCS1PrivateKey(key)
	block := &pem.Block{
		Type:  "RSA PRIVATE KEY",
		Bytes: privateKeyBytes,
	}
	err = pem.Encode(file, block)
	if err != nil {
		return err
	}
	return nil
}

func main() {
	privateKey, err := generateRSAKeyPair()
	if err != nil {
		fmt.Println("Error generating RSA key pair:", err)
		return
	}
	err = savePrivateKey(privateKey, "private.key")
	if err != nil {
		fmt.Println("Error saving private key:", err)
		return
	}
	fmt.Println("RSA private key saved to private.key")
}

上述代码中,`generateRSAKeyPair`函数用于生成RSA密钥对,`savePrivateKey`函数用于保存私钥到文件中。运行该程序后,会在当前目录下生成一个名为`private.key`的私钥文件。

接下来,我们可以使用该私钥进行RSA加密和解密:

package main

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

func loadPrivateKey(filename string) (*rsa.PrivateKey, error) {
	keyData, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	block, _ := pem.Decode(keyData)
	key, err := x509.ParsePKCS1PrivateKey(block.Bytes)
	if err != nil {
		return nil, err
	}
	return key, nil
}

func rsaEncrypt(data []byte, publicKey *rsa.PublicKey) ([]byte, error) {
	return rsa.EncryptPKCS1v15(rand.Reader, publicKey, data)
}

func rsaDecrypt(ciphertext []byte, privateKey *rsa.PrivateKey) ([]byte, error) {
	return rsa.DecryptPKCS1v15(rand.Reader, privateKey, ciphertext)
}

func main() {
	privateKey, err := loadPrivateKey("private.key")
	if err != nil {
		fmt.Println("Error loading private key:", err)
		return
	}
	publicKey := privateKey.Public().(*rsa.PublicKey)

	data := []byte("Hello, RSA!")
	ciphertext, err := rsaEncrypt(data, publicKey)
	if err != nil {
		fmt.Println("Error encrypting data:", err)
		return
	}

	plaintext, err := rsaDecrypt(ciphertext, privateKey)
	if err != nil {
		fmt.Println("Error decrypting data:", err)
		return
	}
	fmt.Println("Decrypted data:", string(plaintext))
}

在上述代码中,`loadPrivateKey`函数用于加载私钥,`rsaEncrypt`函数用于使用公钥进行数据加密,`rsaDecrypt`函数用于使用私钥进行数据解密。我们可以看到,经过RSA加密和解密后,得到的明文与原始数据一致。

MD5哈希

MD5是一种常用的哈希函数,它可以将任意长度的数据转换为一个128位的哈希值。在Golang中,我们可以使用`crypto/md5`包来实现MD5哈希。

下面是一个示例代码,演示如何对字符串进行MD5哈希:

package main

import (
	"crypto/md5"
	"encoding/hex"
	"fmt"
)

func md5Hash(data []byte) string {
	hasher := md5.New()
	hasher.Write(data)
	hash := hasher.Sum(nil)
	return hex.EncodeToString(hash)
}

func main() {
	data := []byte("Hello, MD5!")
	hash := md5Hash(data)
	fmt.Println("MD5 hash:", hash)
}

在上述代码中,`md5Hash`函数用于对数据进行MD5哈希,返回一个十六进制表示的哈希值。运行该程序后,会输出字符串`Hello, MD5!`的MD5哈希值。

结论

通过本文的介绍,我们学习了如何使用Golang进行RSA加密和MD5哈希的操作。RSA和MD5是常用的加密算法,它们可以用于保护数据的机密性和完整性。在实际应用中,我们可以根据需要选择合适的加密算法来保护敏感数据。

相关推荐