package rsa import( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "encoding/base64" "goskeleton/app/global/variable" "fmt" ) func GenerateRSAKeyPair() ([]byte, []byte, error) { priKey, err := rsa.GenerateKey(rand.Reader, variable.ConfigYml.GetInt("RSA.keySize")) if err != nil { return nil, nil, err } pubKey := &priKey.PublicKey // 转换为字节切片 priASN1 := x509.MarshalPKCS1PrivateKey(priKey) priPEM := pem.EncodeToMemory(&pem.Block{ Type: "PRIVATE KEY", Bytes: priASN1, }) pubASN1, err := x509.MarshalPKIXPublicKey(pubKey) if err != nil { return nil, nil, err } pubPEM := pem.EncodeToMemory(&pem.Block{ Type: "PUBLIC KEY", Bytes: pubASN1, }) return pubPEM, priPEM, nil } func DecryptWithPrivateKey(privateKey *rsa.PrivateKey, encryptedPassword []byte) ([]byte, error) { decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, encryptedPassword) if err != nil { return nil, fmt.Errorf("failed to decrypt password: %v", err) } return decryptedBytes, nil } func DecodeBase64(encodedString string) ([]byte, error) { decodedBytes, err := base64.StdEncoding.DecodeString(encodedString) if err != nil { return nil, fmt.Errorf("failed to decode base64 string: %v", err) } return decodedBytes, nil } func parsePKCS1PrivateKey(block *pem.Block) (*rsa.PrivateKey, error) { privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { return nil, fmt.Errorf("failed to parse PKCS1 private key: %v", err) } return privateKey, nil } func parsePKCS8PrivateKey(block *pem.Block) (*rsa.PrivateKey, error) { privateKey, err := x509.ParsePKCS8PrivateKey(block.Bytes) if err != nil { return nil, fmt.Errorf("failed to parse PKCS8 private key: %v", err) } return privateKey.(*rsa.PrivateKey), nil } func ParsePrivateKeyFromPEM(pemKey []byte) (*rsa.PrivateKey, error) { block, _ := pem.Decode(pemKey) if block == nil { return nil, fmt.Errorf("failed to parse PEM block") } // 尝试解析 PKCS#1 格式 privateKey, err := parsePKCS1PrivateKey(block) if err == nil { return privateKey, nil } // 如果不是 PKCS#1 格式,尝试解析 PKCS#8 格式 return parsePKCS8PrivateKey(block) }