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)
}
}
RSA-Keypair
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.