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