You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.3 KiB
77 lines
1.3 KiB
1 year ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"crypto/rand"
|
||
|
"crypto/rsa"
|
||
|
"crypto/x509"
|
||
|
"encoding/asn1"
|
||
|
"encoding/gob"
|
||
|
"encoding/pem"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
reader := rand.Reader
|
||
|
bitSize := 2048
|
||
|
|
||
|
key, err := rsa.GenerateKey(reader, bitSize)
|
||
|
checkError(err)
|
||
|
|
||
|
publicKey := key.PublicKey
|
||
|
|
||
|
saveGobKey("private.key", key)
|
||
|
savePEMKey("private.pem", key)
|
||
|
|
||
|
saveGobKey("public.key", publicKey)
|
||
|
savePublicPEMKey("public.pem", publicKey)
|
||
|
}
|
||
|
|
||
|
func saveGobKey(fileName string, key interface{}) {
|
||
|
outFile, err := os.Create(fileName)
|
||
|
checkError(err)
|
||
|
defer outFile.Close()
|
||
|
|
||
|
encoder := gob.NewEncoder(outFile)
|
||
|
err = encoder.Encode(key)
|
||
|
checkError(err)
|
||
|
}
|
||
|
|
||
|
func savePEMKey(fileName string, key *rsa.PrivateKey) {
|
||
|
outFile, err := os.Create(fileName)
|
||
|
checkError(err)
|
||
|
defer outFile.Close()
|
||
|
|
||
|
var privateKey = &pem.Block{
|
||
|
Type: "PRIVATE KEY",
|
||
|
Bytes: x509.MarshalPKCS1PrivateKey(key),
|
||
|
}
|
||
|
|
||
|
err = pem.Encode(outFile, privateKey)
|
||
|
checkError(err)
|
||
|
}
|
||
|
|
||
|
func savePublicPEMKey(fileName string, pubkey rsa.PublicKey) {
|
||
|
asn1Bytes, err := asn1.Marshal(pubkey)
|
||
|
checkError(err)
|
||
|
|
||
|
var pemkey = &pem.Block{
|
||
|
Type: "PUBLIC KEY",
|
||
|
Bytes: asn1Bytes,
|
||
|
}
|
||
|
|
||
|
pemfile, err := os.Create(fileName)
|
||
|
checkError(err)
|
||
|
defer pemfile.Close()
|
||
|
|
||
|
err = pem.Encode(pemfile, pemkey)
|
||
|
checkError(err)
|
||
|
}
|
||
|
|
||
|
func checkError(err error) {
|
||
|
if err != nil {
|
||
|
fmt.Println("Fatal error ", err.Error())
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|