Golang pgp没有调整

时间:2017-08-28 02:59:54

标签: go gnupg pgp

我有一个使用gpg密钥的应用程序,并提示输入密码来读取它。这就是我这样做的方式(基于我在别处找到的一个例子:

func Decrypt(publicKeyring string, secretKeyring string, key string, password string) (string, error) {

    var entity *openpgp.Entity
    var entityList openpgp.EntityList

    keyringFileBuffer, err := os.Open(secretKeyring)
    if err != nil {
        return "", err
    }

    defer keyringFileBuffer.Close()
    entityList, err = openpgp.ReadKeyRing(keyringFileBuffer)
    if err != nil {
        return "", err
    }
    entity = entityList[0]

    passphraseByte := []byte(password)
    entity.PrivateKey.Decrypt(passphraseByte)
    for _, subkey := range entity.Subkeys {
        subkey.PrivateKey.Decrypt(passphraseByte)
    }

    dec, err := base64.StdEncoding.DecodeString(key)
    if err != nil {
        return "", err
    }

    // Decrypt it with the contents of the private key
    md, err := openpgp.ReadMessage(bytes.NewBuffer(dec), entityList, nil, nil)
    if err != nil {
        return "", err
    }
    bytes, err := ioutil.ReadAll(md.UnverifiedBody)
    if err != nil {
        return "", err
    }
    decStr := string(bytes)

    return decStr, nil

} 

这里假设用户有一个传递的KeyRin,默认值是secring,如下所示:

viper.SetDefault("gpgsecretkeyring", home+"/.gnupg/secring.gpg")

然而,

我收到的报告显示,某些Mac用户正在努力让应用程序正常运行,原因是他们不知道如何定义分组。

似乎较新版本的GnuPG已经弃用了该版本。

https://www.gnupg.org/faq/whats-new-in-2.1.html#nosecring

此时我不知道如何使用golang.org/x/crypto/openpgp读取密钥。有没有最佳方法的例子?

2 个答案:

答案 0 :(得分:0)

我厌倦了解决这个问题,因此我决定从gpg -dqos.Exec发送package gpg import ( "bytes" "encoding/base64" "os/exec" ) func Decrypt(key string) (string, error) { var cmd exec.Cmd var output bytes.Buffer gpgCmd, err := exec.LookPath("gpg") if err != nil { return "", err } cmd.Path = gpgCmd cmd.Args = []string{"--decrypt", "--quiet"} dec, err := base64.StdEncoding.DecodeString(key) if err != nil { return "", err } // return the reader interface for dec (byte array) d := bytes.NewReader(dec) // pipe d to gpg commands stdin cmd.Stdin = d cmd.Stdout = &output if err := cmd.Run(); err != nil { return "", err } // return the output from the gpg command return output.String(), nil } 更容易。样品:

{{1}}

答案 1 :(得分:0)

GnuPG 2.1引入了两个变化:

  • secring.gpg合并到pubring.gpg文件中,您应该能够从pubring.gpg文件中读取密钥。
  • 对于新安装,使用了新的密钥箱格式,go库不支持该格式(至少从今天开始)。旧安装(因此,使用旧格式的密钥环)不会自动合并。

如果您想使用GnuPG的密钥环,请直接拨打GnuPG。如果你想使用Go的库,请不要弄乱GnuPG的密钥环文件并存储你自己的密钥副本。