如何在Golang中生成带密码短语的PGP密钥对?
在Golang中生成带密码短语的PGP密钥对
你不需要分别生成公钥和私钥——当你用密码短语加密生成私钥后,直接从私钥对象中提取公钥即可。以下是基于Gopenpgp库的正确实现示例:
package main import ( "fmt" "github.com/ProtonMail/gopenpgp/v2/helper" ) func main() { passphrase := "your-strong-passphrase" name := "Your Name" email := "your@email.com" // 生成带密码短语加密的私钥(包含公钥信息) armoredPrivateKey, err := helper.GenerateKey(name, email, []byte(passphrase), "rsa", 4096) if err != nil { fmt.Printf("生成私钥失败: %v\n", err) return } // 从加密的私钥中提取公钥 armoredPublicKey, err := helper.GetPublicKey(armoredPrivateKey) if err != nil { fmt.Printf("提取公钥失败: %v\n", err) return } fmt.Println("带密码的私钥:\n", armoredPrivateKey) fmt.Println("\n公钥:\n", armoredPublicKey) }
关键说明
helper.GenerateKey生成的是经过密码短语加密的ASCII装甲私钥,这个私钥已包含对应公钥信息,无需单独生成。- 使用
helper.GetPublicKey可直接从加密私钥中提取公钥,省掉额外生成步骤。 - 务必使用高强度密码短语,避免弱密码导致私钥被破解。
可选方案:使用官方golang.org/x/crypto/openpgp包
若不想依赖第三方封装库,也可以用官方加密包实现:
package main import ( "bytes" "fmt" "golang.org/x/crypto/openpgp" "golang.org/x/crypto/openpgp/packet" "os" ) func generatePGPKeyPair(name, email, passphrase string) (string, string, error) { var privBuf, pubBuf bytes.Buffer // 配置密钥生成参数 config := &packet.Config{ RSAKeyBits: 4096, } // 生成包含公私钥的实体 entity, err := openpgp.NewEntity(name, "", email, config) if err != nil { return "", "", err } // 用密码短语加密私钥及子密钥 err = entity.PrivateKey.Encrypt([]byte(passphrase)) if err != nil { return "", "", err } for _, subkey := range entity.Subkeys { err = subkey.PrivateKey.Encrypt([]byte(passphrase)) if err != nil { return "", "", err } } // 导出加密的ASCII装甲私钥 w, err := openpgp.ArmoredWriterTo(&privBuf, openpgp.PrivateKeyType) if err != nil { return "", "", err } defer w.Close() if err := entity.SerializePrivate(w, config); err != nil { return "", "", err } // 导出ASCII装甲公钥 pubW, err := openpgp.ArmoredWriterTo(&pubBuf, openpgp.PublicKeyType) if err != nil { return "", "", err } defer pubW.Close() if err := entity.Serialize(pubW); err != nil { return "", "", err } return privBuf.String(), pubBuf.String(), nil } func main() { privKey, pubKey, err := generatePGPKeyPair("Your Name", "your@email.com", "strong-passphrase-123") if err != nil { fmt.Printf("生成密钥对失败: %v\n", err) os.Exit(1) } fmt.Println("加密私钥:\n", privKey) fmt.Println("\n公钥:\n", pubKey) }
内容的提问来源于stack exchange,提问作者Pranav Sharan
相关产品推荐
相关产品推荐

