• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    golang使用RSA加密和解密的实现示例

    发布者: 皮3591 | 发布时间: 2025-8-14 12:13| 查看数: 48| 评论数: 0|帖子模式

    前提

    本文章我们是先读取的RSA文件,所以需要先生成RSA,并且保存在文件中,再进行加密

    生成RSA公钥和密钥

    如果没有公钥和密钥,可以先看看我上一篇文章
    生成RSA公钥和密钥

    读取文件

    在加密前,我们需要读取RSA文件内容,关于读取文件内容,我封装了一个"获取文件内容"的方法:
    1. // GetFileContent 获取文件内容
    2. func GetFileContent(filePath string) (string, error) {
    3.         file, err := os.Open(filePath)
    4.         if err != nil {
    5.                 return "", err
    6.         }
    7.         defer file.Close()
    8.         inputReader := bufio.NewReader(file)
    9.         s := ""
    10.         for {
    11.                 inputString, readerError := inputReader.ReadString('\n')
    12.                 s = fmt.Sprintf("%s%s", s, inputString)
    13.                 if readerError == io.EOF {
    14.                         break
    15.                 }
    16.         }
    17.         return s, nil
    18. }
    复制代码
    因为我们要读取 公钥 和 密钥 两个文件,所以避免重复的代码,我们封装了这么个方法,避免重复的代码。

    加密
    1. package main

    2. import (
    3.         "crypto/rand"
    4.         "crypto/rsa"
    5.         "crypto/sha256"
    6.         "crypto/x509"
    7.         "demo-mall-api-user/internal/utils"
    8.         "encoding/base64"
    9.         "encoding/pem"
    10.         "fmt"
    11. )

    12. func main() {
    13.         // 定义目录和文件
    14.         dirPath := "/app/rsa"
    15.         fileName := "public.pem"
    16.         filePath := fmt.Sprintf("%s/%s", dirPath, fileName)  // 拼接成完整的文件地址

    17.         publicContent, err := utils.GetFileContent(filePath) // 读取文件内容
    18.         if err != nil {
    19.                 fmt.Println("读取公钥文件错误:", err.Error())
    20.                 return
    21.         }

    22.         // 解析PEM格式的数据
    23.         block, _ := pem.Decode([]byte(publicContent))
    24.         if block == nil || block.Type != "PUBLIC KEY" {
    25.                 fmt.Println("公钥类型错误")
    26.                 return
    27.         }

    28.         // 解析公钥
    29.         publicKey, _ := x509.ParsePKIXPublicKey(block.Bytes)
    30.         // 类型断言为*rsa.PublicKey
    31.         rsaPub, ok := publicKey.(*rsa.PublicKey)
    32.         if !ok {
    33.                 fmt.Println("public key is not RSA")
    34.                 return
    35.         }

    36.         // 待加密的字符串
    37.         message := []byte("Lucky")
    38.         // 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
    39.         label := []byte("")
    40.         ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, rsaPub, message, label)

    41.         // 转换为base64编码的字符串
    42.         hexStr := base64.StdEncoding.EncodeToString(ciphertext)

    43.         fmt.Println("加密前的数据:", string(message))
    44.         fmt.Println("加密后:", hexStr)
    45. }
    复制代码
    运行程序:
    1. go run main.go
    复制代码
    会打印出:

    以上,我们就得到了加密后的数据

    解密
    1. package main

    2. import (
    3.         "crypto/rand"
    4.         "crypto/rsa"
    5.         "crypto/sha256"
    6.         "crypto/x509"
    7.         "demo-mall-api-user/internal/utils"
    8.         "encoding/base64"
    9.         "encoding/pem"
    10.         "fmt"
    11.         "log"
    12. )

    13. func main() {
    14.         // 定义目录和文件
    15.         dirPath := "/app/rsa"
    16.         fileName := "private.key"
    17.         filePath := fmt.Sprintf("%s/%s", dirPath, fileName) // 拼接成完整的文件地址

    18.         privateContent, err := utils.GetFileContent(filePath) // 读取文件内容
    19.         if err != nil {
    20.                 fmt.Println("读取密钥文件错误:", err.Error())
    21.                 return
    22.         }

    23.         // 解析PEM格式的数据
    24.         block, _ := pem.Decode([]byte(privateContent))
    25.         if block == nil || block.Type != "RSA PRIVATE KEY" {
    26.                 fmt.Println("私钥类型错误")
    27.                 return
    28.         }
    29.         // 解析密钥
    30.         privateKey, _ := x509.ParsePKCS1PrivateKey(block.Bytes)

    31.         // 待解密的字符串
    32.         encodedCiphertext := "BR8ixCEoG4/EW63VEf/lnBiATAaPIdH6OzxB96vSGewR+Dm98e1KcpPvvRoggw7GJfdk2gxlDN8kuk4BeoSxuKdIe9FupbY+V58k83ZWpyCY2anDYmFkBIog9dVddTR41ktxRp3+lr1+ztoZUivJMUerbqmarNvCwf/2ALQ/4Qn7bBZo4c0OPXHij9bOfaN+elBmqLMFB4DrCYdoNbU49i95XjziUv9wdLRLSTD+xnMxjc3jDAFTyhDgw9abdrqJgilAcPjXmsZhyqkcEOwCm16ZjGn+OmzarvC6O6aCClRYiTcGOg2utt4c5fDDRSoGqmeULu1971b7DpETThey3g=="

    33.         // 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
    34.         label := []byte("")

    35.         // Base64编码的字符串解码
    36.         ciphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext)
    37.         if err != nil {
    38.                 log.Fatalf("failed to decode base64 ciphertext: %v", err)
    39.                 return
    40.         }

    41.         // 使用私钥进行解密
    42.         plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, label)
    43.         if err != nil {
    44.                 log.Fatalf("Error decrypting message: %s", err)
    45.                 return
    46.         }
    47.         fmt.Println("解密前的数据:", encodedCiphertext)
    48.         fmt.Println("解密后:", string(plaintext))
    49. }
    复制代码
    运行程序:
    1. go run main.go
    复制代码
    会打印出:

    到此这篇关于golang使用RSA加密和解密的实现示例的文章就介绍到这了,更多相关golang RSA加密和解密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表