Go语言 如何实现RSA加密解密
来源:脚本之家
2022-12-31 12:13:32
0浏览
收藏
本篇文章向大家介绍《Go语言 如何实现RSA加密解密》,主要包括加密、解密、RSA,具有一定的参考价值,需要的朋友可以参考一下。
RSA是一种非对称加密算法,它的名字是由它的三位开发者,即RonRivest、AdiShamir和LeonardAdleman 的姓氏的首字母组成的(Rivest-Shamir-Adleman ),可用于数据加密和数字签名。
用于数据加密时,消息发送方利用对方的公钥进行加密,消息接受方收到密文时使用自己的私钥进行解密。
实现代码如下:
import (
"crypto/rsa"
"crypto/rand"
"crypto/x509"
"os"
"encoding/pem"
"fmt"
)
//生成RSA私钥和公钥,保存到文件中
func GenerateRSAKey(bits int){
//GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
//Reader是一个全局、共享的密码用强随机数生成器
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err!=nil{
panic(err)
}
//保存私钥
//通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
//使用pem格式对x509输出的内容进行编码
//创建文件保存私钥
privateFile, err := os.Create("private.pem")
if err!=nil{
panic(err)
}
defer privateFile.Close()
//构建一个pem.Block结构体对象
privateBlock:= pem.Block{Type: "RSA Private Key",Bytes:X509PrivateKey}
//将数据保存到文件
pem.Encode(privateFile,&privateBlock)
//保存公钥
//获取公钥的数据
publicKey:=privateKey.PublicKey
//X509对公钥编码
X509PublicKey,err:=x509.MarshalPKIXPublicKey(&publicKey)
if err!=nil{
panic(err)
}
//pem格式编码
//创建用于保存公钥的文件
publicFile, err := os.Create("public.pem")
if err!=nil{
panic(err)
}
defer publicFile.Close()
//创建一个pem.Block结构体对象
publicBlock:= pem.Block{Type: "RSA Public Key",Bytes:X509PublicKey}
//保存到文件
pem.Encode(publicFile,&publicBlock)
}
//RSA加密
func RSA_Encrypt(plainText []byte,path string)[]byte{
//打开文件
file,err:=os.Open(path)
if err!=nil{
panic(err)
}
defer file.Close()
//读取文件的内容
info, _ := file.Stat()
buf:=make([]byte,info.Size())
file.Read(buf)
//pem解码
block, _ := pem.Decode(buf)
//x509解码
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err!=nil{
panic(err)
}
//类型断言
publicKey:=publicKeyInterface.(*rsa.PublicKey)
//对明文进行加密
cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
if err!=nil{
panic(err)
}
//返回密文
return cipherText
}
//RSA解密
func RSA_Decrypt(cipherText []byte,path string) []byte{
//打开文件
file,err:=os.Open(path)
if err!=nil{
panic(err)
}
defer file.Close()
//获取文件内容
info, _ := file.Stat()
buf:=make([]byte,info.Size())
file.Read(buf)
//pem解码
block, _ := pem.Decode(buf)
//X509解码
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err!=nil{
panic(err)
}
//对密文进行解密
plainText,_:=rsa.DecryptPKCS1v15(rand.Reader,privateKey,cipherText)
//返回明文
return plainText
}
测试代码如下:
func main(){
//生成密钥对,保存到文件
GenerateRSAKey(2048)
message:=[]byte("hello world")
//加密
cipherText:=RSA_Encrypt(message,"public.pem")
fmt.Println("加密后为:",string(cipherText))
//解密
plainText := RSA_Decrypt(cipherText, "private.pem")
fmt.Println("解密后为:",string(plainText))
}
测试结果如下:

补充:golang中关于RSA加密、解密、签名、验签的总结
golang中关于RSA的加密、解密、签名、验签的使用主要在于使用x509及rsa package下相关的方法。
gocrypt是本人对一般常用的加/解密、签名/验签、hash的封装库,欢迎大家使用。
以下总结相关的各种变化类型:
1.秘钥、加密/签名字符串加密的格式
目前主要见到有hex及base64
(1)hex
针对hex的加解密
hex.DecodeString(s string)//解密 hex.EncodeToString(src []byte) string//加密
(2)base64
base64.StdEncoding.DecodeString(s string) ([]byte, error)//解密 base64.StdEncoding.EncodeToString(src []byte) string//加密
2.私钥的格式
解析私钥的方式如下:
(1)PKCS1
x509.ParsePKCS1PrivateKey(der []byte) (key interface{}, err error)
(2)PKCS8
x509.ParsePKCS8PrivateKey(der []byte) (key interface{}, err error)
3.采用的数字签名算法SHA
以下为RSA sign的不同说明:
(1)SHA1
hash := sha1.New()
hash.Write([]byte(originalData))
encryptedData, err := rsa.SignPKCS1v15(rand.Reader, prvKey, crypto.SHA1, hash.Sum(nil))
(2)SHA256
hash := sha256.New()
hash.Write([]byte(originalData))
encryptedData, err := rsa.SignPKCS1v15(rand.Reader, prvKey, crypto.SHA256, hash.Sum(nil))
4.RSA使用类型
主要有加密/解密、签名/验签4种方式,且加密/解密与签名/验签均是一个相反的过程。两对是根据对公钥及私钥的使用划分的。
加密/解密是采用公钥加密,私钥解密。
签名/验签是采用私钥签名,公钥验签。
(1)加密
rsa.EncryptPKCS1v15(rand io.Reader, pub *PublicKey, msg []byte) ([]byte, error)
(2)解密
rsa.DecryptPKCS1v15(rand io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)
(3)签名
rsa.SignPKCS1v15(rand io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)
(4)验签
rsa.VerifyPKCS1v15(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error
5.具体的使用示例
(1)加密:采用sha1算法加密后转base64格式
func RsaEncryptWithSha1Base64(originalData,publicKey string)(string,error){
key, _ := base64.StdEncoding.DecodeString(publicKey)
pubKey, _ := x509.ParsePKIXPublicKey(key)
encryptedData,err:=rsa.EncryptPKCS1v15(rand.Reader, pubKey.(*rsa.PublicKey), []byte(originalData))
return base64.StdEncoding.EncodeToString(encryptedData),err
}
(2)解密:对采用sha1算法加密后转base64格式的数据进行解密(私钥PKCS1格式)
func RsaDecryptWithSha1Base64(encryptedData,privateKey string)(string,error){
encryptedDecodeBytes,err:=base64.StdEncoding.DecodeString(encryptedData)
if err!=nil {
return "",err
}
key,_:=base64.StdEncoding.DecodeString(privateKey)
prvKey,_:=x509.ParsePKCS1PrivateKey(key)
originalData,err:=rsa.DecryptPKCS1v15(rand.Reader,prvKey,encryptedDecodeBytes)
return string(originalData),err
}
(3)签名:采用sha1算法进行签名并输出为hex格式(私钥PKCS8格式)
func RsaSignWithSha1Hex(data string, prvKey string) (string, error) {
keyByts, err := hex.DecodeString(prvKey)
if err != nil {
fmt.Println(err)
return "", err
}
privateKey, err := x509.ParsePKCS8PrivateKey(keyByts)
if err != nil {
fmt.Println("ParsePKCS8PrivateKey err", err)
return "", err
}
h := sha1.New()
h.Write([]byte([]byte(data)))
hash := h.Sum(nil)
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.SHA1, hash[:])
if err != nil {
fmt.Printf("Error from signing: %s\n", err)
return "", err
}
out := hex.EncodeToString(signature)
return out, nil
}
(4)验签:对采用sha1算法进行签名后转base64格式的数据进行验签
func RsaVerySignWithSha1Base64(originalData, signData, pubKey string) error{
sign, err := base64.StdEncoding.DecodeString(signData)
if err != nil {
return err
}
public, _ := base64.StdEncoding.DecodeString(pubKey)
pub, err := x509.ParsePKIXPublicKey(public)
if err != nil {
return err
}
hash := sha1.New()
hash.Write([]byte(originalData))
return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA1, hash.Sum(nil), sign)
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。
好了,本文到此结束,带大家了解了《Go语言 如何实现RSA加密解密》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!
版本声明
本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
Go语言获取文件的名称、前缀、后缀
- 上一篇
- Go语言获取文件的名称、前缀、后缀
- 下一篇
- golang 如何实现HTTP代理和反向代理
查看更多
最新文章
-
- Golang · Go教程 | 18分钟前 |
- Golang如何判断变量类型?
- 393浏览 收藏
-
- Golang · Go教程 | 27分钟前 |
- Golang云原生微服务实战教程
- 310浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang迭代器与懒加载结合应用
- 110浏览 收藏
-
- Golang · Go教程 | 1小时前 | 性能优化 并发安全 Golangslicemap 预设容量 指针拷贝
- Golangslicemap优化技巧分享
- 412浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang代理模式与访问控制实现解析
- 423浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang事件管理模块实现教程
- 274浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Golang接口多态实现全解析
- 241浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- GolangHTTP优化与中间件组合技巧
- 365浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Golang模块版本管理与升级技巧
- 247浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3162次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3375次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3403次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4506次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3784次使用
查看更多
相关文章
-
- Go 语言简单实现Vigenere加密算法
- 2022-12-29 319浏览
-
- Go实现凯撒密码加密解密
- 2022-12-29 327浏览
-
- 通过Golang编写一个AES加密解密工具
- 2022-12-30 373浏览
-
- Golang实现AES加密和解密的示例代码
- 2023-01-07 307浏览
-
- golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)
- 2023-02-17 385浏览

