GO创建RSA算法私钥、公钥
rascode.zip code file download
package main import ( "crypto/rsa" "crypto/rand" "crypto/x509" "encoding/pem" "os" "fmt" ) 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) //包: rsa //- 参数1:随机数, crypto/rand, 随机数生成器 //- 参数2:秘钥长度 //- 返回值:私钥 privateKey, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { return err } // //2. 要对生成的私钥进行编码处理, x509, 按照规则,进行序列化处理, 生成der编码的数据 //MarshalPKCS1PrivateKey将公钥序列化为PKCS格式DER编码。 // MarshalPKCS1PrivateKey converts a private key to ASN.1 DER encoded form. //func MarshalPKCS1PrivateKey(key *rsa.PrivateKey) []byte { 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: "SZ RSA PRIVATE KEY", //随便填写 Headers: nil, //可选信息,包括私钥加密方式等 Bytes: priDerText, //私钥编码后的数据 } //4. 将Pem Block数据写入到磁盘文件 fileHandler1, err := os.Create(PrivateKeyFile) if err != nil { return err } //关闭句柄 defer fileHandler1.Close() //func Encode(out io.Writer, b *Block) error err = pem.Encode(fileHandler1, &block) if err != nil { return err } fmt.Println("++++++++++++++ 生成公钥 +++++++++++") /* 1. 获取公钥, 通过私钥获取 2. 要对生成的私钥进行编码处理, x509, 按照规则,进行序列化处理, 生成der编码的数据 3. 创建Block代表PEM编码的结构, 并填入der编码的数据 4. 将Pem Block数据写入到磁盘文件 */ //1. 获取公钥, 通过私钥获取 pubKey := privateKey.PublicKey //注意是对象,而不是地址 //2. 要对生成的私钥进行编码处理, x509, 按照规则,进行序列化处理, 生成der编码的数据 pubKeyDerText := x509.MarshalPKCS1PublicKey(&pubKey) //3. 创建Block代表PEM编码的结构, 并填入der编码的数据 block1 := pem.Block{ Type: "SZ RSA Public Key", Headers: nil, Bytes: pubKeyDerText, } //4. 将Pem Block数据写入到磁盘文件 fileHandler2, err := os.Create(PublicKeyFile) if err != nil { return err } //关闭句柄 defer fileHandler2.Close() err = pem.Encode(fileHandler2, &block1) if err != nil { return err } return nil } func main() { fmt.Printf("generate rsa private key ...\n") err := generateKeyPair(2048) if err != nil { fmt.Printf("generate rsa private failed, err : %v", err) } fmt.Printf("generate rsa private key successfully!\n") }