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