最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前提

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

生成RSA公鑰和密鑰

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

生成RSA公鑰和密鑰

讀取文件

在加密前,我們需要讀取RSA文件內(nèi)容,關(guān)于讀取文件內(nèi)容,我封裝了一個(gè)"獲取文件內(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取 公鑰 和 密鑰 兩個(gè)文件,所以避免重復(fù)的代碼,我們封裝了這么個(gè)方法,避免重復(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("讀取公鑰文件錯(cuò)誤:", err.Error())
		return
	}

	// 解析PEM格式的數(shù)據(jù)
	block, _ := pem.Decode([]byte(publicContent))
	if block == nil || block.Type != "PUBLIC KEY" {
		fmt.Println("公鑰類型錯(cuò)誤")
		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)簽,可以為空,如果加密時(shí)定義了某個(gè)值,解密時(shí)也需要用相同的值
	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

會(huì)打印出:

以上,我們就得到了加密后的數(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("讀取密鑰文件錯(cuò)誤:", err.Error())
		return
	}

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

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

	// 標(biāo)簽,可以為空,如果加密時(shí)定義了某個(gè)值,解密時(shí)也需要用相同的值
	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

會(huì)打印出:

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

相關(guān)文章

  • golang如何優(yōu)雅的編寫事務(wù)代碼示例

    golang如何優(yōu)雅的編寫事務(wù)代碼示例

    這篇文章主要介紹了golang如何優(yōu)雅的編寫事務(wù)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • go語言操作redis連接池的方法

    go語言操作redis連接池的方法

    這篇文章主要介紹了go語言操作redis連接池的方法,涉及Go語言操作radis的技巧,需要的朋友可以參考下
    2015-03-03
  • 解析Go?中的?rune?類型

    解析Go?中的?rune?類型

    rune類型是?Go?語言的一種特殊數(shù)字類型,Go?語言通過rune處理中文,支持國際化多語言,本文給大家介紹Go?中的?rune?類型,感興趣的朋友一起看看吧
    2022-03-03
  • Go1.20最新資訊go?arena手動(dòng)管理內(nèi)存鴿了

    Go1.20最新資訊go?arena手動(dòng)管理內(nèi)存鴿了

    由于過于繁雜,Go?核心團(tuán)隊(duì)成員@Ian?Lance?Taylor,也表態(tài):目前尚未做出任何決定,也不可能在短期內(nèi)做出任何決定,可以認(rèn)為這個(gè)提案基本鴿了,今天這篇文章就是給大家同步目前的情況
    2023-11-11
  • Go語言中Context的實(shí)現(xiàn)示例

    Go語言中Context的實(shí)現(xiàn)示例

    context是Go語言中用于在多個(gè)goroutine之間傳遞取消信號(hào)、超時(shí)控制和上下文信息的重要機(jī)制,通過合理使用context,開發(fā)者可以更高效地管理并發(fā)任務(wù),感興趣的可以了解一下
    2025-07-07
  • Go語言基礎(chǔ)變量的聲明及初始化示例詳解

    Go語言基礎(chǔ)變量的聲明及初始化示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)變量的聲明及初始化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • go語言異常panic和恢復(fù)recover用法實(shí)例

    go語言異常panic和恢復(fù)recover用法實(shí)例

    這篇文章主要介紹了go語言異常panic和恢復(fù)recover用法,實(shí)例分析了異常panic和恢復(fù)recover使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運(yùn)算

    Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運(yùn)算

    這篇文章主要為大家介紹了Go語言普通指針unsafe.Pointer?uintpt之間的關(guān)系及指針運(yùn)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例

    Go語言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例

    這篇文章主要介紹了Go語言實(shí)現(xiàn)牛頓法求平方根函數(shù)的案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go模板后端渲染時(shí)vue單頁面沖突

    Go模板后端渲染時(shí)vue單頁面沖突

    go后端模版語法是通過 {{}} ,vue也是通過雙花括號(hào)來渲染的,如果使用go渲染vue的html頁面的時(shí)候就會(huì)報(bào)錯(cuò),本文主要介紹了Go模板后端渲染時(shí)vue單頁面沖突,感興趣的可以了解一下
    2024-01-01

最新評論

谷城县| 周口市| 抚宁县| 博湖县| 德钦县| 鱼台县| 安庆市| 长乐市| 婺源县| 宜城市| 江口县| 莎车县| 永嘉县| 仁化县| 吴桥县| 河西区| 闵行区| 西丰县| 南通市| 宜章县| 和顺县| 惠州市| 通化市| 莆田市| 漳州市| 青海省| 墨竹工卡县| 呼伦贝尔市| 铁岭市| 万源市| 巴彦淖尔市| 汾阳市| 社旗县| 麻栗坡县| 贵州省| 新晃| 马龙县| 台北市| 建平县| 安庆市| 准格尔旗|