package utils
import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "crypto/x509" "encoding/base64" "encoding/pem" "os" )
func GenerateRSAKey(bits int) { privateKey, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { panic(err) } X509PrivateKey := x509.MarshalPKCS1PrivateKey(privateKey) privateFile, err := os.Create("private.pem") if err != nil { panic(err) } defer privateFile.Close() privateBlock := pem.Block{Type: "RSA Private Key", Bytes: X509PrivateKey} pem.Encode(privateFile, &privateBlock)
publicKey := privateKey.PublicKey X509PublicKey, err := x509.MarshalPKIXPublicKey(&publicKey) if err != nil { panic(err) } publicFile, err := os.Create("public.pem") if err != nil { panic(err) } defer publicFile.Close() publicBlock := pem.Block{Type: "RSA Public Key", Bytes: X509PublicKey} pem.Encode(publicFile, &publicBlock) }
func GetRSAPrivateKey(path string) *rsa.PrivateKey { file, err := os.Open(path) if err != nil { panic(err) } defer file.Close() info, _ := file.Stat() buf := make([]byte, info.Size()) file.Read(buf) block, _ := pem.Decode(buf) privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) return privateKey }
func GetRSAPublicKey(path string) *rsa.PublicKey { file, err := os.Open(path) if err != nil { panic(err) } defer file.Close() info, _ := file.Stat() buf := make([]byte, info.Size()) file.Read(buf) block, _ := pem.Decode(buf) publicKeyInterface, err := x509.ParsePKIXPublicKey(block.Bytes) if err != nil { panic(err) } publicKey := publicKeyInterface.(*rsa.PublicKey) return publicKey }
func GetSign(msg []byte, path string) string { privateKey := GetRSAPrivateKey(path) hash := sha256.New() hash.Write(msg) bytes := hash.Sum(nil) sign, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, bytes) if err != nil { panic(sign) } signStr := base64.StdEncoding.EncodeToString(sign) return signStr }
func VerifySign(msg []byte, sign string, path string) bool { publicKey := GetRSAPublicKey(path) hash := sha256.New() hash.Write(msg) bytes := hash.Sum(nil) signBaseDe, _ := base64.StdEncoding.DecodeString(sign) err := rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, bytes, signBaseDe) return err == nil }
|