You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:15:41