安全是软件开始中很重要的一个环节,在金融场景以及设计资产的场景下更是如此,在加密算法中主要使用较多加密方式分别是对称加密和非对称加密,对称加密中的代表是AES,DES,3DES等,非对称加密中使用比较多的是RSA,ECC等,最近火热的比特币中就使用ECC椭圆曲线算法,本篇文章主要是笔者在使用Golang在使用RSA中使用私钥加密公钥解密中遇到的问题,以及寻找的解决方案进行阐述,希望可以帮助到大家!

附上:

喵了个咪的博客:w-blog.cn
gorsa-Github地址:https://github.com/farmerx/gorsa
喵咪优化过的gorsa-Github地址:https://github.com/wenzhenxi/gorsa

PS:特别感谢farmerx提供的gorsa实现

1.了解RSA

要了解RSA就要先分别对称加密和非对称加密的区别:

  • 对称加密中只有一个钥匙也就是KEY,加解密都依靠这组密钥
  • 非对称加密中有公私钥之分,私钥可以生产公钥(比特币的钱包地址就是公钥),一般加密通过公钥加密私钥解密(也有私钥加密公钥解密)

RSA使用场景:

  1. 我们最熟悉的就是HTTPS中就是使用的RSA加密,CA机构给你颁发的就是私钥给到我们进行配置,在请求过程中端用CA内置到系统的公钥加密,请求道服务器由服务器进行解密验证,保障了传输过程中的请求加密

  2. 高安全场景(比如金融设备银联交易等)下的双向认证(一机一密钥),每台机器本地都会生成一组公私钥对,并且吧公钥发送给服务器,这个使用发起的请求模型如下:


服务器的公私钥对简称: s_puk,s_pvk

端生成的公私钥对简称: c_puk,c_pvk

服务器存储: s_pvk和c_puk

端存储 :s_puk,c_pvk

端使用c_pvk加密请求 -> 服务器使用c_puk解密(验证端) -> 使用s_pvk加密返回结果返回 -> 端使用s_puk解密获得返回结果(验证服务器)

这个过程中就完成了端认证服务器,服务器认证端称之为双向认证(这里是指简单的表达这个模型,更加安全的模式中会引入加密机进一步保障安全)


PS:关于RSA加密的具体算法实现可以参考以下两篇文章

RSA算法原理(一)

RSA算法原理(二)

2.GoRSA

在Golang使用RSA加密算法的时候笔者遇到了一个坑,在网上找遍了官方提供的库crypto/rsa中只有公钥加密私钥解密的实现,意味着无法实现私钥加密公钥解密,而要实现双向认证必须要使用私钥加密公钥解密,通过几个小时的寻找其实有很多论坛中也在讨论这个问题,也有童鞋在GITHUB上面提及了一些解决方案,有用C封装了一次的等,但是使用其他特别难受甚至运行不起来,在快要绝望的时候找到了貌似可以使用的库,通过查看源码使用的是软实现,在这里推荐给大家

基于 https://github.com/farmerx/gorsa 进行封装优化了如下几点:

  • 优化公私钥需要提前注册初始化,在并发情况下公私钥匙会混乱的问题
  • 加密机没有进行base64处理,在跨程序传递或存储过程中都需要base64避免二次封装
  • 传入返回都统一使用string类型避免转换麻烦

获取扩展包:

go get github.com/wenzhenxi/gorsa

具体使用:

package mainimport ("log""errors""github.com/wenzhenxi/gorsa"
)var Pubkey = `-----BEGIN 公钥-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk+89V7vpOj1rG6bTAKYM
56qmFLwNCBVDJ3MltVVtxVUUByqc5b6u909MmmrLBqS//PWC6zc3wZzU1+ayh8xb
UAEZuA3EjlPHIaFIVIz04RaW10+1xnby/RQE23tDqsv9a2jv/axjE/27b62nzvCW
eItu1kNQ3MGdcuqKjke+LKhQ7nWPRCOd/ffVqSuRvG0YfUEkOz/6UpsPr6vrI331
hWRB4DlYy8qFUmDsyvvExe4NjZWblXCqkEXRRAhi2SQRCl3teGuIHtDUxCskRIDi
aMD+Qt2Yp+Vvbz6hUiqIWSIH1BoHJer/JOq2/O6X3cmuppU4AdVNgy8Bq236iXvr
MQIDAQAB
-----END 公钥-----
`var Pirvatekey = `-----BEGIN 私钥-----
MIIEpAIBAAKCAQEAk+89V7vpOj1rG6bTAKYM56qmFLwNCBVDJ3MltVVtxVUUByqc
5b6u909MmmrLBqS//PWC6zc3wZzU1+ayh8xbUAEZuA3EjlPHIaFIVIz04RaW10+1
xnby/RQE23tDqsv9a2jv/axjE/27b62nzvCWeItu1kNQ3MGdcuqKjke+LKhQ7nWP
RCOd/ffVqSuRvG0YfUEkOz/6UpsPr6vrI331hWRB4DlYy8qFUmDsyvvExe4NjZWb
lXCqkEXRRAhi2SQRCl3teGuIHtDUxCskRIDiaMD+Qt2Yp+Vvbz6hUiqIWSIH1BoH
Jer/JOq2/O6X3cmuppU4AdVNgy8Bq236iXvrMQIDAQABAoIBAQCCbxZvHMfvCeg+
YUD5+W63dMcq0QPMdLLZPbWpxMEclH8sMm5UQ2SRueGY5UBNg0WkC/R64BzRIS6p
jkcrZQu95rp+heUgeM3C4SmdIwtmyzwEa8uiSY7Fhbkiq/Rly6aN5eB0kmJpZfa1
6S9kTszdTFNVp9TMUAo7IIE6IheT1x0WcX7aOWVqp9MDXBHV5T0Tvt8vFrPTldFg
IuK45t3tr83tDcx53uC8cL5Ui8leWQjPh4BgdhJ3/MGTDWg+LW2vlAb4x+aLcDJM
CH6Rcb1b8hs9iLTDkdVw9KirYQH5mbACXZyDEaqj1I2KamJIU2qDuTnKxNoc96HY
2XMuSndhAoGBAMPwJuPuZqioJfNyS99x++ZTcVVwGRAbEvTvh6jPSGA0k3cYKgWR
NnssMkHBzZa0p3/NmSwWc7LiL8whEFUDAp2ntvfPVJ19Xvm71gNUyCQ/hojqIAXy
tsNT1gBUTCMtFZmAkUsjqdM/hUnJMM9zH+w4lt5QM2y/YkCThoI65BVbAoGBAMFI
GsIbnJDNhVap7HfWcYmGOlWgEEEchG6Uq6Lbai9T8c7xMSFc6DQiNMmQUAlgDaMV
b6izPK4KGQaXMFt5h7hekZgkbxCKBd9xsLM72bWhM/nd/HkZdHQqrNAPFhY6/S8C
IjRnRfdhsjBIA8K73yiUCsQlHAauGfPzdHET8ktjAoGAQdxeZi1DapuirhMUN9Zr
kr8nkE1uz0AafiRpmC+cp2Hk05pWvapTAtIXTo0jWu38g3QLcYtWdqGa6WWPxNOP
NIkkcmXJjmqO2yjtRg9gevazdSAlhXpRPpTWkSPEt+o2oXNa40PomK54UhYDhyeu
akuXQsD4mCw4jXZJN0suUZMCgYAgzpBcKjulCH19fFI69RdIdJQqPIUFyEViT7Hi
bsPTTLham+3u78oqLzQukmRDcx5ddCIDzIicMfKVf8whertivAqSfHytnf/pMW8A
vUPy5G3iF5/nHj76CNRUbHsfQtv+wqnzoyPpHZgVQeQBhcoXJSm+qV3cdGjLU6OM
HgqeaQKBgQCnmL5SX7GSAeB0rSNugPp2GezAQj0H4OCc8kNrHK8RUvXIU9B2zKA2
z/QUKFb1gIGcKxYr+LqQ25/+TGvINjuf6P3fVkHL0U8jOG0IqpPJXO3Vl9B8ewWL
cFQVB/nQfmaMa4ChK0QEUe+Mqi++MwgYbRHx1lIOXEfUJO+PXrMekw==
-----END 私钥-----
`func main() {// 公钥加密私钥解密if err := applyPubEPriD(); err != nil {log.Println(err)}// 公钥解密私钥加密if err := applyPriEPubD(); err != nil {log.Println(err)}
}// 公钥加密私钥解密
func applyPubEPriD() error {pubenctypt, err := gorsa.PublicEncrypt(`hello world`,Pubkey)if err != nil {return err}pridecrypt, err := gorsa.PriKeyDecrypt(pubenctypt,Pirvatekey)if err != nil {return err}if string(pridecrypt) != `hello world` {return errors.New(`解密失败`)}return nil
}// 公钥解密私钥加密
func applyPriEPubD() error {prienctypt, err := gorsa.PriKeyEncrypt(`hello world`,Pirvatekey)if err != nil {return err}pubdecrypt, err := gorsa.PublicDecrypt(prienctypt,Pubkey)if err != nil {return err}if string(pubdecrypt) != `hello world` {return errors.New(`解密失败`)}return nil
}

3 总结

RSA在软件开发中运用广泛,如果大家也遇到了Golang私钥加密公钥解密问题,欢迎大家使用gorsa扩展解决问题,欢迎大家收藏点赞!

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

[Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)相关推荐

  1. 分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥

    测试: public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.ini ...

  2. RSA不对称加密,公钥加密私钥解密,私钥加密公钥解密

    RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作. RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一 ...

  3. 公钥加密私钥解密私钥加密公钥解密

    公钥加密体制 1.公钥加密体制用于保密性时,就是公钥加密,私钥解密. 因为公钥是可以公开了, 那么任何人都可以使用公钥对信息进行加密,但是只有持有私钥的人才能正确解密.这样就保证了信息的保密性,因为只 ...

  4. 非对称加密 公钥解密_了解非对称公钥加密

    非对称加密 公钥解密 Asymmetric cryptography, also called public key cryptography, is an essential element of ...

  5. C#实现RSA公钥加密私钥解密、私钥加密公钥解密以及Pcks12、X509证书加解密、签名验签

    RSA的私钥签名公钥验签可以见 http://blog.csdn.net/starfd/article/details/51917916,所以这里就没提供对应代码,具体代码如下: using Org. ...

  6. RSA双向加解密(公钥加密-私钥解密;私钥加密-公钥解密)

    非对称加密算法中,提供一个公钥一个私钥.一般情况下,采用公钥加密.私钥解密的方式. 假设有这样一个场景:服务A与服务B需要通信,通信内容为了安全需要进行加密传输,并且服务A与服务B不能互相持有对方的钥 ...

  7. C#.NET Rsa私钥加密公钥解密

    在C#中,RSA私钥只能签名,不能加密,如果要加密,要借助BouncyCastle库. nuget 中引用 Portable.BouncyCastle. 工具类: RsaEncryptUtil usi ...

  8. 关于js私钥加密公钥解密的问题

    博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...

  9. openssl公钥加密私钥解密和私钥加密公钥解密

    最近在弄音视频上云,参考了腾讯云中SecretId和SecretKey,直观理解SecretKey是私钥,用于签名,然后公钥验证签名,个人理解SecretId在腾讯云系统里面有一条记录,此记录存放着公 ...

  10. php为什么容易解密,PHP代码的加密和解密

    现在常见的对PHP代码进行加密的方式主要分为两大类: Ø 不需要加载php扩展的: Ø 需要加载php扩展的 第一种方式使用方便,不需要对php服务器进行配置,或加载其他模块,因此可以方便地部署在租用 ...

最新文章

  1. LVS(Linux Virtual Server)三种负载均衡模型和十种调度的简单介绍
  2. 微软提供支持Windows 10预览版和EdgeHTML 14的预配置虚拟主机
  3. C++11 运行时变量类型判断
  4. 从fragment开始向上查找实现了某个接口的parent Fragment 或者 Activity
  5. “约见”面试官系列之常见面试题第八篇说说原型与原型链(建议收藏)
  6. 从attention到Transformer+CV中的self-attention
  7. ASP.NET MVC基于标注特性的Model验证:一个Model,多种验证规则
  8. 说说如何抛出Java异常
  9. android jar包 权限,Android系统启动执行jar程序
  10. 输入两个整数,求他们相除的余数
  11. 记忆网络之在对话系统中的应用
  12. vscode下载与安装,解决安装包下载慢问题
  13. 最前线|库克:苹果正在考虑调整iPhone定价策略
  14. vue-meta实现router动态设置meta标签
  15. android 点击对话框按钮 不关闭按钮,Android在单击PositiveButton后不要关闭AlertDialog...
  16. tf.flags.DEFINE解释
  17. 高效办公之云端实时协作企业办公软件:石墨文档
  18. 省-市-区三级联动选择地址 + 地图定位(高德api定位获取位置信息),互相联动显示
  19. 案例:vivo基于Java技术栈的实时监控系统
  20. GHM------Gradient Harmonized Single-stage Detector 从梯度的方向来解决样本不均衡的问题

热门文章

  1. html如何根据颜色排序,Excel技巧:按颜色排序或筛选
  2. 深思新推出高性价比智能卡加密锁--魔锐1
  3. 【2019秋招】携程数据分析岗笔试编程题——画心形
  4. 最小二乘法线性拟合介绍以及matlab实现
  5. 没拿到一毛钱股份的老公和CEO身份曝光,发文妻子的选妃照也被挖出来了……
  6. it工程师和码农的区别_码农属于it行业吗 工程师、程序员、码农有什么区别?...
  7. android studio生成的apk文件无法安装
  8. python 数据预处理 毕设_python 数据预处理 毕设
  9. 视频文件压缩成什么格式最小?
  10. SVN Clean up 失败和SVN is already locked情况解决