go之rsa加解密实现
RSA是一种非对称加密,是由一对密钥来进行加解密的过程,分别称为公钥和私钥。通常个人保存私钥,公钥是公开的。在不直接传递密钥的情况下,完成解密,能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险
目前项目做漏洞扫描,如果你用了是之前的填充方式,那么一定会扫描出来漏洞安全风险,并会建议你使用oaep填充方式。
什么是OAEP
RSA OAEP
是RSA
加密机制的一种方案,全称是Optimal Asymmetric Encryption Padding
(最优非对称加密填充),其安全性更高
go实现示例
/*
@Author : Uyynot
@Email : uyynot@qq.com
@Time : 2023/11/20 10:07
@File : test.go
@Project : test
@Desc :
*/
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
"os"
)
// 解析公钥
func ReadParsePublicKey(filename string) (*rsa.PublicKey, error) {
//获取公钥字节
publicKeyBytes, err := os.ReadFile(filename)
//fmt.Println("publicKeyBytes:", publicKeyBytes)
//fmt.Println("err:", err)
if err != nil {
return nil, err
}
// 2、解码公钥字节,生成加密块对象
block, _ := pem.Decode(publicKeyBytes)
//fmt.Println("block:", block)
//fmt.Println("rest:", rest)
if block == nil {
return nil, errors.New("公钥信息有误")
}
//3、解析DER编码的公钥,生成公钥接口
publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
//fmt.Println("publicKeyInterface:", publicKeyInterface)
//fmt.Println("err:", err)
if err != nil {
return nil, err
}
// 4、公钥接口转型成公钥对象
publicKey := publicKeyInterface.(*rsa.PublicKey)
//fmt.Println("publicKey:", publicKey)
return publicKey, nil
}
// 读取私钥文件,解析出私钥对象
func ReadParsePrivaterKey(filename string) (*rsa.PrivateKey, error) {
// 1、读取私钥文件,获取私钥字节
privateKeyBytes, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
// 2、对私钥文件进行编码,生成加密块对象
block, _ := pem.Decode(privateKeyBytes)
if block == nil {
return nil, errors.New("私钥信息错误!")
}
// 3、解析DER编码的私钥,生成私钥对象
privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return privateKey, nil
}
func main() {
//abced := base64.StdEncoding.EncodeToString([]byte("abcdefg"))
//fmt.Println("abced:", abced)
pub_key, err := ReadParsePublicKey("public.pem")
pri_key, err := ReadParsePrivaterKey("private.pem")
fmt.Println("err:", err)
fmt.Println("pub_key:", pub_key)
fmt.Println("pri_key:", pri_key)
// 要加密的明文
//plainText := []byte("abcdh1234中国")
plainText := []byte("{\"app_id\":\"123456789\", \"app_secret\":\"abcdefg%*sdfsdfsfd\",\"timestamp\":1698893284836}")
// 使用公钥加密明文
cipherText, err := rsa.EncryptOAEP(sha1.New(), rand.Reader, pub_key, plainText, nil)
if err != nil {
panic(err)
}
fmt.Printf("Cipher text: %x\n", cipherText)
b64CipherTest := base64.StdEncoding.EncodeToString(cipherText)
fmt.Println("b64CipherTest:", b64CipherTest)
// 使用私钥解密密文
decryptedPlainText, err := rsa.DecryptOAEP(sha1.New(), rand.Reader, pri_key, cipherText, nil)
if err != nil {
panic(err)
}
fmt.Printf("Decrypted plain text: %s\n", decryptedPlainText)
//// 生成一对RSA公私钥
//privKey, err := rsa.GenerateKey(rand.Reader, 2048)
//if err != nil {
// panic(err)
//}
//// 要加密的明文
//plainText := []byte("Hello RSA!")
//// 使用公钥加密明文
//cipherText, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, &privKey.PublicKey, plainText, nil)
//if err != nil {
// panic(err)
//}
//fmt.Printf("Cipher text: %x\n", cipherText)
//// 使用私钥解密密文
//decryptedPlainText, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, privKey, cipherText, nil)
//if err != nil {
// panic(err)
//}
//fmt.Printf("Decrypted plain text: %s\n", decryptedPlainText)
//// 签名消息
//hashed := sha256.Sum256([]byte("message to be signed"))
//signature, err := rsa.SignPKCS1v15(rand.Reader, privKey, crypto.SHA256, hashed[:])
//if err != nil {
// panic(err)
//}
//fmt.Printf("Signature: %x\n", signature)
//// 验证签名
//err = rsa.VerifyPKCS1v15(&privKey.PublicKey, crypto.SHA256, hashed[:], signature)
//if err != nil {
// panic(err)
//}
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: