golang Golang RSA密钥生成

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang Golang RSA密钥生成相关的知识,希望对你有一定的参考价值。

/*
 * Genarate rsa keys.
 */

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/x509"
	"encoding/asn1"
	"encoding/gob"
	"encoding/pem"
	"fmt"
	"os"
)

func main() {
	reader := rand.Reader
	bitSize := 2048

	key, err := rsa.GenerateKey(reader, bitSize)
	checkError(err)

	publicKey := key.PublicKey

	saveGobKey("private.key", key)
	savePEMKey("private.pem", key)

	saveGobKey("public.key", publicKey)
	savePublicPEMKey("public.pem", publicKey)
}

func saveGobKey(fileName string, key interface{}) {
	outFile, err := os.Create(fileName)
	checkError(err)
	defer outFile.Close()

	encoder := gob.NewEncoder(outFile)
	err = encoder.Encode(key)
	checkError(err)
}

func savePEMKey(fileName string, key *rsa.PrivateKey) {
	outFile, err := os.Create(fileName)
	checkError(err)
	defer outFile.Close()

	var privateKey = &pem.Block{
		Type:  "PRIVATE KEY",
		Bytes: x509.MarshalPKCS1PrivateKey(key),
	}

	err = pem.Encode(outFile, privateKey)
	checkError(err)
}

func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {
	asn1Bytes, err := asn1.Marshal(pubkey)
	checkError(err)

	var pemkey = &pem.Block{
		Type:  "PUBLIC KEY",
		Bytes: asn1Bytes,
	}

	pemfile, err := os.Create(fileName)
	checkError(err)
	defer pemfile.Close()

	err = pem.Encode(pemfile, pemkey)
	checkError(err)
}

func checkError(err error) {
	if err != nil {
		fmt.Println("Fatal error ", err.Error())
		os.Exit(1)
	}
}

Golang 实现RSA加密解密

生成RSA证书:

openssl方式生成

  • 生成私钥
openssl genrsa -out rsa_private_key.pem 1024
  • 生成公钥
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

Go代码方式生成

package main

import (
   "crypto/rand"
   "crypto/rsa"
   "crypto/x509"
   "encoding/pem"
   "os"
)

//生成RSA私钥和公钥,保存到文件中
// bits 证书大小
func GenerateRSAKey(bits int) {
   //GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥
   //Reader是一个全局、共享的密码用强随机数生成器
   privateKey, err := rsa.GenerateKey(rand.Reader, bits)
   if err != nil {
      panic(err)
   }
   //保存私钥
   //通过x509标准将得到的ras私钥序列化为ASN.1 的 DER编码字符串
   X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey)
   //使用pem格式对x509输出的内容进行编码
   //创建文件保存私钥
   privateFile, err := os.Create("private.pem")
   if err != nil {
      panic(err)
   }
   defer privateFile.Close()
   //构建一个pem.Block结构体对象
   privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey}
   //将数据保存到文件
   pem.Encode(privateFile, &privateBlock)

   //保存公钥
   //获取公钥的数据
   publicKey := privateKey.PublicKey
   //X509对公钥编码
   X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey)
   if err != nil {
      panic(err)
   }
   //pem格式编码
   //创建用于保存公钥的文件
   publicFile, err := os.Create("public.pem")
   if err != nil {
      panic(err)
   }
   defer publicFile.Close()
   //创建一个pem.Block结构体对象
   publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey}
   //保存到文件
   pem.Encode(publicFile, &publicBlock)
}

func main() {
   //生成密钥对,保存到文件
   GenerateRSAKey(2048)
}

RSA数据加/解密

package main

import (
   "crypto/rand"
   "crypto/rsa"
   "crypto/x509"
   "encoding/pem"
   "fmt"
   "os"
)

//RSA加密
// plainText 要加密的数据
// path 公钥匙文件地址
func RSA_Encrypt(plainText []byte, path string) []byte {
   //打开文件
   file, err := os.Open(path)
   if err != nil {
      panic(err)
   }
   defer file.Close()
   //读取文件的内容
   info, _ := file.Stat()
   buf := make([]byte, info.Size())
   file.Read(buf)
   //pem解码
   block, _ := pem.Decode(buf)
   //x509解码

   publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
   if err != nil {
      panic(err)
   }
   //类型断言
   publicKey := publicKeyInterface.(*rsa.PublicKey)
   //对明文进行加密
   cipherText, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, plainText)
   if err != nil {
      panic(err)
   }
   //返回密文
   return cipherText
}

//RSA解密
// cipherText 需要解密的byte数据
// path 私钥文件路径
func RSA_Decrypt(cipherText []byte,path string) []byte{
   //打开文件
   file,err:=os.Open(path)
   if err!=nil{
      panic(err)
   }
   defer file.Close()
   //获取文件内容
   info, _ := file.Stat()
   buf:=make([]byte,info.Size())
   file.Read(buf)
   //pem解码
   block, _ := pem.Decode(buf)
   //X509解码
   privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
   if err!=nil{
      panic(err)
   }
   //对密文进行解密
   plainText,_:=rsa.DecryptPKCS1v15(rand.Reader,privateKey,cipherText)
   //返回明文
   return plainText
}

func main() {
   //加密
   data := []byte("hello world")
   encrypt := RSA_Encrypt(data, "public.pem")
   fmt.Println(string(encrypt))

   // 解密
   decrypt := RSA_Decrypt(encrypt, "private.pem")
   fmt.Println(string(decrypt))
}

以上是关于golang Golang RSA密钥生成的主要内容,如果未能解决你的问题,请参考以下文章

golang 中,非对称加密的实现

golang实现京东支付v2版本

GoLang执行需要输入密码的命令

Golang 实现RSA加密解密

使用 ssh golang 包解析 ssh 密钥

golang 用于生成凭证密钥对的App命令