97人参与 • 2025-04-24 • Golang
本文章我们是先读取的rsa文件,所以需要先生成rsa,并且保存在文件中,再进行加密
如果没有公钥和密钥,可以先看看我上一篇文章
在加密前,我们需要读取rsa文件内容,关于读取文件内容,我封装了一个"获取文件内容"的方法:
// getfilecontent 获取文件内容
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
}因为我们要读取 公钥 和 密钥 两个文件,所以避免重复的代码,我们封装了这么个方法,避免重复的代码。
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) // 读取文件内容
if err != nil {
fmt.println("读取公钥文件错误:", err.error())
return
}
// 解析pem格式的数据
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")
// 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
label := []byte("")
ciphertext, err := rsa.encryptoaep(sha256.new(), rand.reader, rsapub, message, label)
// 转换为base64编码的字符串
hexstr := base64.stdencoding.encodetostring(ciphertext)
fmt.println("加密前的数据:", string(message))
fmt.println("加密后:", hexstr)
}运行程序:
go run main.go
会打印出:

以上,我们就得到了加密后的数据
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) // 读取文件内容
if err != nil {
fmt.println("读取密钥文件错误:", err.error())
return
}
// 解析pem格式的数据
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=="
// 标签,可以为空,如果加密时定义了某个值,解密时也需要用相同的值
label := []byte("")
// base64编码的字符串解码
ciphertext, err := base64.stdencoding.decodestring(encodedciphertext)
if err != nil {
log.fatalf("failed to decode base64 ciphertext: %v", err)
return
}
// 使用私钥进行解密
plaintext, err := rsa.decryptoaep(sha256.new(), rand.reader, privatekey, ciphertext, label)
if err != nil {
log.fatalf("error decrypting message: %s", err)
return
}
fmt.println("解密前的数据:", encodedciphertext)
fmt.println("解密后:", string(plaintext))
}
运行程序:
go run main.go
会打印出:

到此这篇关于golang使用rsa加密和解密的实现示例的文章就介绍到这了,更多相关golang rsa加密和解密内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论