欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang使用RSA加密和解密的實(shí)現(xiàn)示例

 更新時間:2025年03月31日 11:20:49   作者:幸享龍楓  
在Golang中RSA加密和解密是一個常見的操作,本文主要介紹了golang使用RSA加密和解密的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下

前提

本文章我們是先讀取的RSA文件,所以需要先生成RSA,并且保存在文件中,再進(jìn)行加密

生成RSA公鑰和密鑰

如果沒有公鑰和密鑰,可以先看看我上一篇文章

生成RSA公鑰和密鑰

讀取文件

在加密前,我們需要讀取RSA文件內(nèi)容,關(guān)于讀取文件內(nèi)容,我封裝了一個"獲取文件內(nèi)容"的方法:

// GetFileContent 獲取文件內(nèi)容
func GetFileContent(filePath string) (string, error) {
	file, err := os.Open(filePath)
	if err != nil {
		return "", err
	}
	defer file.Close()
	inputReader := bufio.NewReader(file)
	s := ""
	for {
		inputString, readerError := inputReader.ReadString('\n')
		s = fmt.Sprintf("%s%s", s, inputString)
		if readerError == io.EOF {
			break
		}
	}
	return s, nil
}

因?yàn)槲覀円x取 公鑰 和 密鑰 兩個文件,所以避免重復(fù)的代碼,我們封裝了這么個方法,避免重復(fù)的代碼。

加密

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"demo-mall-api-user/internal/utils"
	"encoding/base64"
	"encoding/pem"
	"fmt"
)

func main() {
	// 定義目錄和文件
	dirPath := "/app/rsa"
	fileName := "public.pem"
	filePath := fmt.Sprintf("%s/%s", dirPath, fileName)  // 拼接成完整的文件地址

	publicContent, err := utils.GetFileContent(filePath) // 讀取文件內(nèi)容
	if err != nil {
		fmt.Println("讀取公鑰文件錯誤:", err.Error())
		return
	}

	// 解析PEM格式的數(shù)據(jù)
	block, _ := pem.Decode([]byte(publicContent))
	if block == nil || block.Type != "PUBLIC KEY" {
		fmt.Println("公鑰類型錯誤")
		return
	}

	// 解析公鑰
	publicKey, _ := x509.ParsePKIXPublicKey(block.Bytes)
	// 類型斷言為*rsa.PublicKey
	rsaPub, ok := publicKey.(*rsa.PublicKey)
	if !ok {
		fmt.Println("public key is not RSA")
		return
	}

	// 待加密的字符串
	message := []byte("Lucky")
	// 標(biāo)簽,可以為空,如果加密時定義了某個值,解密時也需要用相同的值
	label := []byte("")
	ciphertext, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, rsaPub, message, label)

	// 轉(zhuǎn)換為base64編碼的字符串
	hexStr := base64.StdEncoding.EncodeToString(ciphertext)

	fmt.Println("加密前的數(shù)據(jù):", string(message))
	fmt.Println("加密后:", hexStr)
}

運(yùn)行程序:

go run main.go

會打印出:

以上,我們就得到了加密后的數(shù)據(jù)

解密

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha256"
	"crypto/x509"
	"demo-mall-api-user/internal/utils"
	"encoding/base64"
	"encoding/pem"
	"fmt"
	"log"
)

func main() {
	// 定義目錄和文件
	dirPath := "/app/rsa"
	fileName := "private.key"
	filePath := fmt.Sprintf("%s/%s", dirPath, fileName) // 拼接成完整的文件地址

	privateContent, err := utils.GetFileContent(filePath) // 讀取文件內(nèi)容
	if err != nil {
		fmt.Println("讀取密鑰文件錯誤:", err.Error())
		return
	}

	// 解析PEM格式的數(shù)據(jù)
	block, _ := pem.Decode([]byte(privateContent))
	if block == nil || block.Type != "RSA PRIVATE KEY" {
		fmt.Println("私鑰類型錯誤")
		return
	}
	// 解析密鑰
	privateKey, _ := x509.ParsePKCS1PrivateKey(block.Bytes)

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

	// 標(biāo)簽,可以為空,如果加密時定義了某個值,解密時也需要用相同的值
	label := []byte("")

	// Base64編碼的字符串解碼
	ciphertext, err := base64.StdEncoding.DecodeString(encodedCiphertext)
	if err != nil {
		log.Fatalf("failed to decode base64 ciphertext: %v", err)
		return
	}

	// 使用私鑰進(jìn)行解密
	plaintext, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privateKey, ciphertext, label)
	if err != nil {
		log.Fatalf("Error decrypting message: %s", err)
		return
	}
	fmt.Println("解密前的數(shù)據(jù):", encodedCiphertext)
	fmt.Println("解密后:", string(plaintext))
}

運(yùn)行程序:

go run main.go

會打印出:

到此這篇關(guān)于golang使用RSA加密和解密的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)golang RSA加密和解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang內(nèi)存對齊的概念及案例詳解

    golang內(nèi)存對齊的概念及案例詳解

    為保證程序順利高效的運(yùn)行,編譯器會把各種類型的數(shù)據(jù)安排到合適的地址,并占用合適的長度,這就是內(nèi)存對齊。本文重點(diǎn)給大家介紹golang內(nèi)存對齊的概念及案例詳解,感興趣的朋友一起看看吧
    2022-02-02
  • go run main.go 一直提示找不到包的解決方案

    go run main.go 一直提示找不到包的解決方案

    這篇文章主要介紹了go run main.go 一直提示找不到包的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go中并發(fā)控制的實(shí)現(xiàn)方式總結(jié)

    Go中并發(fā)控制的實(shí)現(xiàn)方式總結(jié)

    在Go實(shí)際開發(fā)中,并發(fā)安全是老生常談的事情,在并發(fā)下,goroutine之間的存在數(shù)據(jù)資源等方面的競爭,為了保證數(shù)據(jù)一致性、防止死鎖等問題的出現(xiàn),在并發(fā)中需要使用一些方式來實(shí)現(xiàn)并發(fā)控制,本文給大家總結(jié)了幾種實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-12-12
  • golang實(shí)現(xiàn)給圖片加水印

    golang實(shí)現(xiàn)給圖片加水印

    這篇文章主要為大家詳細(xì)介紹了Vue3如何利用golang實(shí)現(xiàn)給圖片加水印,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-12-12
  • go各種import的使用方法講解

    go各種import的使用方法講解

    今天小編就為大家分享一篇關(guān)于go各種import的使用方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 如何使用?Go?獲取你的?IP?地址(推薦)

    如何使用?Go?獲取你的?IP?地址(推薦)

    在Go語言中,獲取IP地址分為公共IP和私有IP兩種方式,公共IP地址通過外部API獲取,本文給大家介紹如何使用?Go?獲取你的?IP?地址,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Golang中如何實(shí)現(xiàn)枚舉詳析

    Golang中如何實(shí)現(xiàn)枚舉詳析

    舉就是將數(shù)據(jù)值一一列出來,枚舉可以用來表示一些固定的值,枚舉是常量組成的,下面這篇文章主要給大家介紹了關(guān)于Golang中如何實(shí)現(xiàn)枚舉的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Golang中的godoc使用簡介(推薦)

    Golang中的godoc使用簡介(推薦)

    Godoc是go語言的文檔化工具,類似于文檔化工具godoc,類似于Python的Docstring和Java的Javadoc,這篇文章主要介紹了Golang中的godoc使用簡介,需要的朋友可以參考下
    2022-10-10
  • Go實(shí)現(xiàn)將任何網(wǎng)頁轉(zhuǎn)化為PDF

    Go實(shí)現(xiàn)將任何網(wǎng)頁轉(zhuǎn)化為PDF

    在許多應(yīng)用場景中,可能需要將網(wǎng)頁內(nèi)容轉(zhuǎn)化為?PDF?格式,使用Go編程語言,結(jié)合一些現(xiàn)有的庫,可以非常方便地實(shí)現(xiàn)這一功能,下面我們就來看看具體實(shí)現(xiàn)方法吧
    2024-11-11
  • golang如何去除字符串的換行符

    golang如何去除字符串的換行符

    這篇文章主要介紹了golang如何去除字符串的換行符問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論