golang使用RSA加密和解密的實(shí)現(xiàn)示例
前提
本文章我們是先讀取的RSA文件,所以需要先生成RSA,并且保存在文件中,再進(jìn)行加密
生成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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go中并發(fā)控制的實(shí)現(xiàn)方式總結(jié)
在Go實(shí)際開發(fā)中,并發(fā)安全是老生常談的事情,在并發(fā)下,goroutine之間的存在數(shù)據(jù)資源等方面的競(jìng)爭(zhēng),為了保證數(shù)據(jù)一致性、防止死鎖等問題的出現(xiàn),在并發(fā)中需要使用一些方式來實(shí)現(xiàn)并發(fā)控制,本文給大家總結(jié)了幾種實(shí)現(xiàn)方式,需要的朋友可以參考下2023-12-12
Go實(shí)現(xiàn)將任何網(wǎng)頁轉(zhuǎn)化為PDF
在許多應(yīng)用場(chǎng)景中,可能需要將網(wǎng)頁內(nèi)容轉(zhuǎn)化為?PDF?格式,使用Go編程語言,結(jié)合一些現(xiàn)有的庫,可以非常方便地實(shí)現(xiàn)這一功能,下面我們就來看看具體實(shí)現(xiàn)方法吧2024-11-11

