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

golang非对称rsa加密实例

生成私钥 公钥

    // 1. 生成RSA私钥privateKey, err := rsa.GenerateKey(rand.Reader, rsaBits)if err != nil {panic("生成RSA私钥失败:" + err.Error())}// 2. 私钥转换为PEM格式并写入文件privateKeyPEM := &pem.Block{Type:  "RSA PRIVATE KEY",Bytes: x509.MarshalPKCS1PrivateKey(privateKey),}privateFile, err := os.Create("private.pem")if err != nil {panic("创建私钥文件失败:" + err.Error())}defer privateFile.Close()if err := pem.Encode(privateFile, privateKeyPEM); err != nil {panic("编码私钥失败:" + err.Error())}// 3. 从私钥提取公钥publicKey := &privateKey.PublicKey// 公钥转换为PEM格式并写入文件publicKeyBytes, err := x509.MarshalPKIXPublicKey(publicKey)if err != nil {panic("序列化公钥失败:" + err.Error())}publicKeyPEM := &pem.Block{Type:  "PUBLIC KEY",Bytes: publicKeyBytes,}publicFile, err := os.Create("public.pem")if err != nil {panic("创建公钥文件失败:" + err.Error())}defer publicFile.Close()if err := pem.Encode(publicFile, publicKeyPEM); err != nil {panic("编码公钥失败:" + err.Error())}println("RSA密钥生成成功!")println("私钥文件:private.pem(后端保管,禁止暴露)")println("公钥文件:public.pem(提供给前端)")

 

加密

    privatePemContent := gconv.Bytes(`-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzMW6nIuSAQzEzK/rSdjxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END PUBLIC KEY-----
`)password := "tyrtffdhfg34534"block, _ := pem.Decode(privatePemContent)if block == nil {notice.Write(r, notice.Error(notice.SystemError, "失败1"))}pub, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {notice.Write(r, notice.Error(notice.SystemError, "失败2", err.Error()))}encryptedData, err := rsa.EncryptPKCS1v15(rand.Reader, pub.(*rsa.PublicKey), []byte(password))if err != nil {notice.Write(r, notice.Error(notice.SystemError, "失败3", err.Error()))}fmt.Print(base64.StdEncoding.EncodeToString(encryptedData))glog.Line(true).Error(r.GetCtx(), encryptedData)

解密

func initRsaPrivateKey() error {// 从配置中获取私钥文件的绝对路径privateKeyAbsPath := helper.CfgGetString(gctx.New(), "这里获取私钥的路径")// 读取私钥文件内容privateKeyBytes, err := os.ReadFile(privateKeyAbsPath)if err != nil {return errors.New("读取私钥文件失败")}// 解码PEM格式的私钥数据block, _ := pem.Decode(privateKeyBytes)if block == nil {return errors.New("解析PEM失败,私钥非标准PEM格式")}// 验证私钥类型是否为RSA私钥if block.Type != "RSA PRIVATE KEY" {return errors.New("私钥类型错误")}// 解析PKCS1格式的RSA私钥rsaPrivateKey, _ = x509.ParsePKCS1PrivateKey(block.Bytes)return nil
}// rsaDecrypt 使用RSA算法解密Base64编码的密文
// 参数:
//   cipherBase64: Base64编码的密文字符串
// 返回值:
//   string: 解密后的明文字符串
//   error: 错误信息,如果解密过程中出现错误则返回错误
func rsaDecrypt(cipherBase64 string) (string, error) {// 初始化RSA私钥,如果失败则记录日志并返回错误err := initRsaPrivateKey()if err != nil {glog.Line(true).Debug(gctx.New(), "获取秘钥失败", err)return "", err}// 将Base64编码的密文解码为字节切片ciphertextBytes, err := base64.StdEncoding.DecodeString(cipherBase64)if err != nil {glog.Line(true).Debug(gctx.New(), "base64decode数据失败", err)return "", err}// 使用RSA PKCS1v15方案进行解密plaintextBytes, err := rsa.DecryptPKCS1v15(rand.Reader, rsaPrivateKey, ciphertextBytes)if err != nil {glog.Line(true).Debug(gctx.New(), "解密失败", err)return "", err}// 将解密后的字节切片转换为字符串并返回return string(plaintextBytes), nil
}

 

http://www.jsqmd.com/news/346008/

相关文章:

  • 快速上手SpringCloudSpringCloudAlibaba,Java程序员必备!
  • 2026年植物提取物厂家权威推荐:聚焦技术、品质与服务的行业标杆! - 深度智识库
  • 递归函数 - 练习6
  • 2026抗皱紧致护肤品公司推荐,成分检测与紧致淡纹效果深度解析 - 品牌鉴赏师
  • 2026华东户外照明行业测评:路灯、景观灯、交通信号灯、智慧路灯、文创灯标杆品牌推荐 - 深度智识库
  • Java基于Spring Boot+Vue的在线学习管理系统
  • Kruskal重构树
  • React 闭包陷阱:一个空依赖数组,毁了我的数据
  • 水位报警相关
  • 批量重命名天花板!OncePower v2.39 中文绿色版 免费无广告 文件管理高效翻倍
  • 2026年有实力的剪叉式升降机,导轨式升降机,固定式升降机厂家专业服务推荐榜 - 品牌鉴赏师
  • 什么是上下文工程(Context Engineering)?一文搞清楚
  • AI岗位薪资真相与大模型系统化学习全攻略_AI大模型岗位薪资真相:多少年包能拿到?普通人如何破局?
  • 设计师狂喜!图片转换王绿色版 专业格式通吃 8 线程极速批量转换
  • 66.搜索旋转数组
  • 教学演示首选!4K 高清录屏神器 免费汉化无广告 自带标注工具
  • 完整教程:C++继承基础:继承中的默认成员函数-静态成员变量-与友元(二)
  • 808KB 轻量王者!Gif123 免费开源 GIF 录屏神器 录编压转一站式搞定
  • Web 实现多组件同步滚动
  • 10 年经典不褪色!美明定时助手 4M 免费无广告 多任务定时超实用
  • 智能健康监测手环设计
  • 为何云卓科技C11吊舱能适配多种规格载具?
  • 智能浇花系统的设计
  • AI智能识别人脸情绪项目
  • 亲测好用! 降AIGC软件 千笔·降AI率助手 VS 学术猹,继续教育首选
  • 【开题答辩全过程】以 基于Python的茶叶销售数据可视化分析系统设计实现为例,包含答辩的问题和答案
  • 剖析黑龙江汽车噪音治理,各品牌价格与服务对比排名 - 工业品牌热点
  • leetcode 904. Fruit Into Baskets 水果成篮
  • 【开题答辩全过程】以 基于PHP的发热病人管理平台的设计与实现为例,包含答辩的问题和答案
  • 设计稿还原为什么总是出问题?一次设计转代码的实测分享