主页 > imtoken最新版本下载 > 《Golang软件推荐》RSA公私钥加解密库

《Golang软件推荐》RSA公私钥加解密库

imtoken最新版本下载 2023-05-06 05:07:08

安全是软件一开始就非常重要的一个环节,尤其是金融场景和资产设计场景。 在加密算法中,主要使用较多的加密方式,即对称加密和非对称加密。 对称加密的代表是AES、DES、3DES等,RSA、ECC等在非对称加密中被广泛使用。 最近大热的比特币用到了ECC椭圆曲线算法。 本文主要使用Golang在RSA中使用私钥加密。 对公钥解密遇到的问题和找到的解决办法进行了说明,希望对大家有所帮助!

附:

喵的博客:w-blog.cngorsa-Github地址:喵的优化gorsa-Github地址:rsa

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

1.了解RSA

要理解RSA,首先要区分对称加密和非对称加密的区别:

RSA使用场景:

我们最熟悉的就是HTTPS中使用的RSA加密。 CA机构发给您的私钥交给我们配置。 请求过程中,端使用CA内置的公钥加密,请求服务器由服务器解密。 验证,保证传输过程中高安全场景(如金融设备银联交易等)下的双向认证(一机一钥)。 每台机器都会在本地生成一组公私钥对,并将公钥发送给服务器,这种用法发起的请求模型如下:

客户端生成的公私钥对的缩写:cpuk,cpvk

服务器存储:spvk 和 cpuk

结束存储:spuk、cpvk

端使用cpvk加密请求->服务端使用cpuk解密(认证端)->使用spvk加密返回结果->端使用spuk解密并获取返回结果(认证服务器)

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

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

2.GoRSA

在Golang使用RSA加密算法时比特币使用的共识算法是比特币使用的共识算法是,笔者遇到了一个坑。 我在网上搜索了官方库crypto/rsa。 只实现了公钥加密和私钥解密,也就是说不能实现私钥加密和公钥解密。 要实现双向认证,必须使用私钥对公钥进行加密和解密。 经过几个小时的搜索,很多论坛也讨论过这个问题,也有童鞋在GITHUB上提到了一些解决方案,用C等打包一次,但是用其他的就特别难受,甚至无法运行。 快要绝望的时候,找到了一个貌似可以用的库。 通过查看源码,我使用的是软实现。 我推荐给这里的每个人。

在打包优化的基础上,优化了以下几点:

获取扩展包:

 go get github.com/wenzhenxi/gorsa  

具体用途:

 package main
import (
    "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扩展来解决。 欢迎点赞!

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