go之rsa加解密实现

RSA是一种非对称加密,是由一对密钥来进行加解密的过程,分别称为公钥和私钥。通常个人保存私钥,公钥是公开的。在不直接传递密钥的情况下,完成解密,能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险

目前项目做漏洞扫描,如果你用了是之前的填充方式,那么一定会扫描出来漏洞安全风险,并会建议你使用oaep填充方式。

什么是OAEP

RSA OAEPRSA加密机制的一种方案,全称是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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!