go中如何使用openpgp生成的密钥对

How to use key pair generated by openpgp in go

我正在尝试使用 openpgp 库生成密钥对,当我想通过加密测试字符串来测试它时,它 returns 出现以下错误 openpgp: invalid argument: cannot encrypt because no candidate hash functions are compiled in. (Wanted RIPEMD160 in this case.)。但是,当我传递从 gpg.

导出的 public 密钥时,它会起作用

我也想知道如何像 gpg --generate-key 那样加密私钥?

func main() {
    var e *openpgp.Entity
    var pubKey *bytes.Buffer

    e, _ = openpgp.NewEntity("testUser", "test", "test@test.test", nil)

    for _, id := range e.Identities {
        err := id.SelfSignature.SignUserId(id.UserId.Id, e.PrimaryKey, e.PrivateKey, nil)

        if err != nil {
            fmt.Println(err)
            return
        }
    }

    buf := new(bytes.Buffer)
    w, err := armor.Encode(buf, openpgp.PublicKeyType, nil)

    if err != nil {
        fmt.Println(err)
        return
    }

    e.Serialize(w)
    w.Close()
    pubKey = buf

    // Encrypting test with public key 
    entity, err := openpgp.ReadArmoredKeyRing(pubKey)

    if err != nil {
        fmt.Println(err)
        return
    }

    buf = new(bytes.Buffer)

    encoderWriter, err := armor.Encode(buf, "PGP MESSAGE", make(map[string]string))

    if err != nil {
        fmt.Println(err)
        return
    }

    encryptorWriter, err := openpgp.Encrypt(encoderWriter, entity, nil, nil, nil)

    if err != nil {
        fmt.Println(err)
        return
    }

    encryptorWriter.Write([]byte("hello world"))
    encryptorWriter.Close()
    encoderWriter.Close()

    fmt.Println(buf.String())
}

我遇到了完全相同的错误。

TL;博士

TS;博士

由于官方的“golang.org/x/crypto/openpgp”包被冻结和弃用,只要我们使用“golang.org/x/crypto/openpgp”包,似乎目前唯一的解决方法是;

  1. 降级 Go 版本和包,然后 blank import "_ golang.org/x/crypto/ripemd160" as @mh-cbon .
  2. 自行修补被拒绝的 PR。 (因x/crypto/openpgp包被冻结而被拒绝)

但我必须在 Go 1.16.6 上实现一个 OpenPGP 密钥对生成器。 不要问为什么...

所以,我目前的选择是使用分叉包。这是 one of the abounding forks that the Go team mentioned as a sample.

  • github.com/ProtonMail/go-crypto 包裹@ GitHub
    1. go get github.com/ProtonMail/go-crypto
    2. go.mod
    3. 中删除 golang.org/x/crypto/openpgp
    4. 将源代码中的“golang.org/x/crypto/openpgp”全部替换为"github.com/ProtonMail/go-crypto/openpgp"
    5. go mod tidy

参考资料

  1. "x/crypto/openpgp: mark as frozen and deprecated" |问题 #44226 |去 |戈朗@GitHub
  2. "x/crypto/openpgp: new entities cannot be encrypted to by default" |问题 #37646 |去 |戈朗@GitHub
  3. "x/crypto/openpgp: new entities cannot be encrypted to by default" |问题 #12153 |去 |戈朗@GitHub