共计 1228 个字符,预计需要花费 4 分钟才能阅读完成。
随着互联网的高速倒退,人们对平安的要求也越来越高。密码学中两大经典算法,一个是对称加解密,另一个是非对称加解密,这里就来分享一下非对称加密算法的代表:RSA 加解密。
在 Go 语言中实现 RSA
加解密还是比较简单的,网上很多教程都是基于 Go 原生规范库写的,代码量较多。这里分享一个好用的库:https://github.com/forgoer/openssl。
装置
go get https://github.com/forgoer/openssl
秘钥生成
秘钥能够生成在文件里,也是生成到 Buffer 里,只有实现了 io.Writer
即可。
import (
"io/ioutil"
"os"
"github.com/forgoer/openssl"
)
func main() {
// 创立私钥文件
priFile, err := os.Create("private.key") // 也能够应用 buffer, priBuf := bytes.NewBuffer(nil)
if err != nil {panic(err)
}
defer priFile.Close()
// 生成私钥到文件
_ = openssl.RSAGenerateKey(1024, priFile)
// 创立公钥文件
pubFile, err := os.Create("public.key")
if err != nil {panic(err)
}
defer priFile.Close()
// 通过私钥生成公钥到文件
priByte, _ := ioutil.ReadFile("private.key")
_ = openssl.RSAGeneratePublicKey(priByte, pubFile)
}
加解密
应用公钥加密,私钥解密。
src := []byte("123456")
pubByte, _ := ioutil.ReadFile("public.key")
// 公钥加密
dst, _ := openssl.RSAEncrypt(src, pubByte)
priByte, _ := ioutil.ReadFile("private.key")
// 私钥解密
res, _ := openssl.RSADecrypt(dst, priByte)
fmt.Println(string(res)) // 123456
签名及验证
应用私钥签名,公钥验证。
// 私钥签名
sign, err := openssl.RSASign([]byte("123456"), priByte, crypto.SHA256)
if err != nil {panic(err)
}
// 公钥验证签名
err = openssl.RSAVerify([]byte("123456"), sign, pubByte, crypto.SHA256)
if err != nil {panic(err)
}
这个加解密库:https://github.com/forgoer/openssl,它还反对 AES
、DES
、RSA
、sha1
、Hmac-Sha1
、sha256
、Hmac-Sha256
等罕用算法。
正文完