RSA-Keypair

package main

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

const privateKeyFile  = "./RsaPrivateKey.pem"
const publicKeyFile  = "./RsaPublicKey.pem"
//需求:生成并保存私钥,公钥
func generateKeyPair(bits int)error{
	//1、生成私钥
	//GenerateKey函数使用随机数据生成器random生成一对具有指定字位数的RSA密钥。
	//func GenerateKey(random io.Reader, bits int) (priv *PrivateKey, err error)
	//-参数1:随机数	crypto/rand	随机数生成器
	//-参数2:密钥长度
	//-返回值:私钥
	privateKey , err := rsa.GenerateKey(rand.Reader,bits)
	if err != nil{
		return err
	}

	//2、对生成的私钥进行编码处理,x509(按照规则,进行序列化处理)生成der编码的数据
	//MarshalPKCS1PublicKey将公钥序列化为PKCS格式DER编码。
	//func MarshalPKCS1PublicKey(pub interface{}) ([]byte, error)
	priDerText := x509.MarshalPKCS1PrivateKey(privateKey)

	//3、创建Block代表的PEM编码的结构,并填入der编码的数据
	//type Block struct {
	//    Type    string            // 得自前言的类型(如"RSA PRIVATE KEY")
	//    Headers map[string]string // 可选的头项
	//    Bytes   []byte            // 内容解码后的数据,一般是DER编码的ASN.1结构
	//}

	block := pem.Block{
		Type:    "Zl RSA PRIVATE KEY",
		Headers: nil,
		Bytes:   priDerText,
	}
	//4、将PemBlock数据写入磁盘文件
	//func Encode(out io.Writer, b *Block) error
	filehandler1,err := os.Create(privateKeyFile)
	if err != nil{
		return err
	}
	err = pem.Encode(filehandler1,&block)
	if err != nil{
		return err
	}
	fmt.Println("PrivateKey OK!")
	defer filehandler1.Close()
	fmt.Println("+++++++++++++生成公钥++++++++++++++")

	//1、获取公钥,通过私钥获取
	pubKey := privateKey.PublicKey	//注意是个对象,而不是地址

	//2、对生成的公钥进行编码处理,x509(按照规则,进行序列化处理)生成der编码的数据
	pubkeyDerText := x509.MarshalPKCS1PublicKey(&pubKey)
	//3、创建Block代表的PEM编码的结构,并填入der编码的数据
	block1 := pem.Block{
		Type:    "ZL RSA Public Key",
		Headers: nil,
		Bytes:   pubkeyDerText,
	}
	//4、将PemBlock数据写入磁盘文件
	filehandler2,err := os.Create(publicKeyFile)
	err = pem.Encode(filehandler2,&block1)
	if err != nil{
		return err
	}
	fmt.Println("PublicKey OK!")
	defer filehandler2.Close()
	return nil
}

func main(){
	fmt.Println("generate rsa private key ...")
	err := generateKeyPair(1024)
	if err != nil{
		fmt.Printf("generate rsa private failed err : %v",err)
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章