当前位置: 首页 > news >正文

golang的RSA加密解密

参考:https://blog.csdn.net/lady_killer9/article/details/118026802

1.加密解密工具类PasswordUtil.go

package utilimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/pem""fmt""log""os""runtime"
)// RSA 加密解密//生成密钥对
func GenerateRsaKey(keySize int, dirPath string) error {privateKey,err := rsa.GenerateKey(rand.Reader,keySize)if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}// x509derText :=x509.MarshalPKCS1PrivateKey(privateKey)// pem Blockblock := &pem.Block{Type:"rsa private key",Bytes:derText,}// just joint, caller must let dirPath rightfile,err := os.Create(dirPath+"private.pem")defer file.Close()if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}err = pem.Encode(file,block)if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}// get PublicKey from privateKeypublicKey := privateKey.PublicKeyderStream,err := x509.MarshalPKIXPublicKey(&publicKey)if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}block = &pem.Block{Type:"rsa public key",Bytes:derStream,}file,err = os.Create(dirPath+"public.pem")if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}err = pem.Encode(file, block)if err != nil{_, file, line, _ := runtime.Caller(0)return Error(file,line+1,err.Error())}return nil
}//加密
func RsaEncrypt(plainText []byte,filePath string) ([]byte, error) {// get pem.Blockblock,err := GetKey(filePath)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}// X509publicInterface,err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}publicKey,flag := publicInterface.(*rsa.PublicKey)if flag == false{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1, "加密发生异常==================="/*errors.RsatransError*/)log.Println(file)log.Println(line)//log.Println("发生异常==============================")}// encryptcipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}return cipherText,nil
}//解密
func RsaDecrypt(cipherText []byte,filePath string) (plainText []byte,err error) {// get pem.Blockblock,err := GetKey(filePath)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}// get privateKeyprivateKey, _ := x509.ParsePKCS1PrivateKey(block.Bytes)defer func() {if err2 := recover();err2 != nil{_, file, line, _ := runtime.Caller(0)err = Error(file,line,"解密发生异常==================")}}()// get plainText use privateKeyplainText, err3 := rsa.DecryptPKCS1v15(rand.Reader, privateKey, cipherText)if err3 != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err3.Error())}return plainText,err
}// 读取公钥/私钥文件,获取解码的pem块
// filePath文件路径
// 返回pem块和错误
func GetKey(filePath string) (*pem.Block,error)  {file,err := os.Open(filePath)defer file.Close()if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}fileInfo,err := file.Stat()if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}buf := make([]byte,fileInfo.Size())_, err = file.Read(buf)if err != nil{_, file, line, _ := runtime.Caller(0)return nil,Error(file,line+1,err.Error())}block, _ := pem.Decode(buf)return block,err
}// 错误格式化
func Error(file string,line int,err string) error {return fmt.Errorf("file:%s line:%d error:%s",file,line,err)
}

2.测试


func Rsapassword(c *gin.Context, loginBody *sysEntity.LoginBody) []map[string]interface{} {var resultList []map[string]interface{}//参数接收//userName := loginBody.UserName//password := loginBody.Password//生成密钥对err := sysUtil.GenerateRsaKey(1024, "./")if err != nil {log.Println("==================生成密钥对发生异常")fmt.Println(err)}//加密plainText := []byte("123456")cipherText, err := sysUtil.RsaEncrypt(plainText, "./public.pem")if err != nil {fmt.Println(err)log.Println("==================加密发生异常")}fmt.Printf("加密后为:%s\n",cipherText)//解密plainText,err = sysUtil.RsaDecrypt(cipherText,"./private.pem")if err!=nil{log.Println("==================解密发生异常")fmt.Println(err)}fmt.Printf("解密后为:%s\n",plainText)return resultList
}

http://www.lryc.cn/news/476003.html

相关文章:

  • 深度学习-梯度消失/爆炸产生的原因、解决方法
  • MVC(Model-View-Controller)模式概述
  • 数据结构 —— 红黑树
  • 《功能高分子学报》
  • Linux特种文件系统--tmpfs文件系统
  • 《基于STMF103的FreeRTOS内核移植》
  • 一七二、Vue3性能优化方式
  • 软件测试--BUG篇
  • Scikit-learn和Keras简介
  • python在word的页脚插入页码
  • Java面试题十四
  • yarn : 无法加载文件,未对文件 进行数字签名。无法在当前系统上运行该脚本。
  • Hadoop——HDFS
  • 计算机的一些基础知识
  • 学习RocketMQ(记录了个人艰难学习RocketMQ的笔记)
  • 【设计模式】策略模式定义及其实现代码示例
  • list与iterator的之间的区别,如何用斐波那契数列探索yield
  • 抖音店铺数据也就是抖店,如何使用小店数据集来挖掘价值?
  • KubeVirt 安装和配置 Windows虚拟机
  • CM API方式设置YARN队列资源
  • Mysql常用语法一篇文章速成
  • Intel nuc x15 重装系统步骤和注意事项(LAPKC71F、LAPKC71E、LAPKC51E)
  • Linux之实战命令59:iwlist应用实例(九十三)
  • 数据库_SQLite3
  • .Net Framework里演示怎么样使用StringBuilder、Math.Min和String.Format
  • Oracle创建存储过程,创建定时任务
  • <HarmonyOS第一课>应用/元服务上架的课后习题
  • 【Python】探索函数的奥秘:从基础到高级的深度解析(下)
  • ima.copilot:智慧因你而生
  • Vue-$el属性