无法使用golang的openpgp数据包签署有效的gpg密钥

Pruthviraj Chauhan

我想用go语言的私有密钥用ascii盔甲签名一个公共密钥。为此,我开发了以下代码,但问题是当我在gpg --check-sigs中检查签名时,由代码创建的签名显示为“坏签名”。请帮忙,因为我找不到解决方法。我已经在golang-nuts上发帖了。我正在为我的大学项目学习golang,现在被困在这里,请帮忙。

    // signer
package main

import (
    "bytes"
    "code.google.com/p/go.crypto/openpgp"
    "code.google.com/p/go.crypto/openpgp/armor"
    "code.google.com/p/go.crypto/openpgp/packet"
    "fmt"
)

// This function takes asciiarmored private key which will sign the public key
//Public key is also ascii armored,pripwd is password of private key in string
//This function will return ascii armored signed public key i.e. (pubkey+sign by prikey)
func SignPubKeyPKS(asciiPub string, asciiPri string, pripwd string) (asciiSignedKey string) {
    //get Private key from armor
    _, priEnt := getPri(asciiPri, pripwd) //pripwd is the password todecrypt the private key
    _, pubEnt := getPub(asciiPub)         //This will generate signature and add it to pubEnt
    usrIdstring := ""
    for _, uIds := range pubEnt.Identities {
        usrIdstring = uIds.Name

    }
    fmt.Println(usrIdstring)
    errSign := pubEnt.SignIdentity(usrIdstring, &priEnt, nil)
    if errSign != nil {
        fmt.Println("Signing Key ", errSign.Error())
        return
    }
    asciiSignedKey = PubEntToAsciiArmor(pubEnt)
    return
}

//get packet.PublicKey and openpgp.Entity of Public Key from ascii armor
func getPub(asciiPub string) (pubKey packet.PublicKey, retEntity openpgp.Entity) {
    read1 := bytes.NewReader([]byte(asciiPub))
    entityList, errReadArm := openpgp.ReadArmoredKeyRing(read1)
    if errReadArm != nil {
        fmt.Println("Reading Pubkey ", errReadArm.Error())
        return
    }
    for _, pubKeyEntity := range entityList {
        if pubKeyEntity.PrimaryKey != nil {
            pubKey = *pubKeyEntity.PrimaryKey
            retEntity = *pubKeyEntity
        }
    }
    return
}

//get packet.PrivateKEy and openpgp.Entity of Private Key from ascii armor
func getPri(asciiPri string, pripwd string) (priKey packet.PrivateKey, priEnt openpgp.Entity) {
    read1 := bytes.NewReader([]byte(asciiPri))
    entityList, errReadArm := openpgp.ReadArmoredKeyRing(read1)
    if errReadArm != nil {
        fmt.Println("Reading PriKey ", errReadArm.Error())
        return
    }
    for _, can_pri := range entityList {
        smPr := can_pri.PrivateKey
        retEntity := can_pri
        if smPr == nil {
            fmt.Println("No Private Key")
            return
        }

        priKey = *smPr

        errDecr := priKey.Decrypt([]byte(pripwd))
        if errDecr != nil {
            fmt.Println("Decrypting ", errDecr.Error())
            return
        }
        retEntity.PrivateKey = &priKey
        priEnt = *retEntity
    }
    return
}

//Create ASscii Armor from openpgp.Entity
func PubEntToAsciiArmor(pubEnt openpgp.Entity) (asciiEntity string) {
    gotWriter := bytes.NewBuffer(nil)
    wr, errEncode := armor.Encode(gotWriter, openpgp.PublicKeyType, nil)
    if errEncode != nil {
        fmt.Println("Encoding Armor ", errEncode.Error())
        return
    }
    errSerial := pubEnt.Serialize(wr)
    if errSerial != nil {
        fmt.Println("Serializing PubKey ", errSerial.Error())
    }
    errClosing := wr.Close()
    if errClosing != nil {
        fmt.Println("Closing writer ", errClosing.Error())
    }
    asciiEntity = gotWriter.String()
    return
}
达米安·图诺德(Damien Tournoud)

该代码看起来大致上还可以,只是它在错误检查方面确实应该更加严格。对错误进行恐慌总比不进行任何错误检查要好(因为它通常会在以后出现段错误)。

问题在于,Signature.SignUserId()内部实现code.google.com/p/go.crypto/openpgp是错误的。它使用的是对密钥进行签名的算法(用于证明子密钥属于主密钥),而不是对用户ID进行签名的算法。

此外,在探索这一点时,我意识到该PublicKey.VerifyUserIdSignature()实现方式仅适用于自签名用户ID,因为它未在哈希中使用正确的公钥。

错误报告,带有修补程序https://code.google.com/p/go/issues/detail?id=7371

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Docker容器中添加GPG密钥会导致“找不到有效的OpenPGP数据”

来自分类Dev

Debian:使用PPA更新软件包失败,并显示错误“ gpg:未找到有效的OpenPGP数据”

来自分类Dev

gpg:在ubuntu中找不到有效的OpenPGP数据

来自分类Dev

无法从 RTP 数据包中提取 RTP 有效负载

来自分类Dev

DMA对小数据包有效吗?

来自分类Dev

从数据包中提取RTP有效负载

来自分类Dev

获取ICMP数据包有效载荷

来自分类Dev

获取ICMP数据包有效载荷

来自分类Dev

如何有效地发送大数据包/合并小数据包?

来自分类Dev

使用Python解压缩数据包的压缩后的有效载荷

来自分类Dev

安装wxPython和“获取gpg:找不到有效的OpenPGP数据”错误

来自分类Dev

sudo apt-add-repository | gpg:找不到有效的 OpenPGP 数据

来自分类Dev

PGP TarBall文件签名密钥验证失败,找不到有效的OpenPGP数据

来自分类Dev

无法正确重建 /etc/apt/trusted.gpg 密钥环:gpg:[不知道]:数据包无效(ctb=01)

来自分类Dev

检查输入的公钥是否是有效的OpenPGP密钥

来自分类Dev

捕获数据包中的数据和有效载荷

来自分类Dev

WinDivert - 修改数据包数据/有效载荷内容

来自分类Dev

ubuntu apt-get存储库给出错误gpg:找不到有效的OpenPGP数据

来自分类Dev

发送带有有效负载的TCP SYN数据包

来自分类Dev

仅带有标头(无问题或资源)的DNS数据包是否有效?

来自分类Dev

C#-数据包更有效的序列化

来自分类Dev

用Ogg容器封装RTP数据包中提取的Opus有效负载的实现

来自分类Dev

在多线程Python程序中捕获数据包的有效方法

来自分类Dev

在.NET中创建有效的数据包嗅探器

来自分类Dev

UDP有效载荷长度和数据包传输

来自分类Dev

捕获仅获取有效载荷的数据包

来自分类Dev

C#-数据包更有效的序列化

来自分类Dev

UDP数据包有效载荷大小是否固定?

来自分类Dev

UDP数据包中的Jnetpcap有效负载修改

Related 相关文章

  1. 1

    在Docker容器中添加GPG密钥会导致“找不到有效的OpenPGP数据”

  2. 2

    Debian:使用PPA更新软件包失败,并显示错误“ gpg:未找到有效的OpenPGP数据”

  3. 3

    gpg:在ubuntu中找不到有效的OpenPGP数据

  4. 4

    无法从 RTP 数据包中提取 RTP 有效负载

  5. 5

    DMA对小数据包有效吗?

  6. 6

    从数据包中提取RTP有效负载

  7. 7

    获取ICMP数据包有效载荷

  8. 8

    获取ICMP数据包有效载荷

  9. 9

    如何有效地发送大数据包/合并小数据包?

  10. 10

    使用Python解压缩数据包的压缩后的有效载荷

  11. 11

    安装wxPython和“获取gpg:找不到有效的OpenPGP数据”错误

  12. 12

    sudo apt-add-repository | gpg:找不到有效的 OpenPGP 数据

  13. 13

    PGP TarBall文件签名密钥验证失败,找不到有效的OpenPGP数据

  14. 14

    无法正确重建 /etc/apt/trusted.gpg 密钥环:gpg:[不知道]:数据包无效(ctb=01)

  15. 15

    检查输入的公钥是否是有效的OpenPGP密钥

  16. 16

    捕获数据包中的数据和有效载荷

  17. 17

    WinDivert - 修改数据包数据/有效载荷内容

  18. 18

    ubuntu apt-get存储库给出错误gpg:找不到有效的OpenPGP数据

  19. 19

    发送带有有效负载的TCP SYN数据包

  20. 20

    仅带有标头(无问题或资源)的DNS数据包是否有效?

  21. 21

    C#-数据包更有效的序列化

  22. 22

    用Ogg容器封装RTP数据包中提取的Opus有效负载的实现

  23. 23

    在多线程Python程序中捕获数据包的有效方法

  24. 24

    在.NET中创建有效的数据包嗅探器

  25. 25

    UDP有效载荷长度和数据包传输

  26. 26

    捕获仅获取有效载荷的数据包

  27. 27

    C#-数据包更有效的序列化

  28. 28

    UDP数据包有效载荷大小是否固定?

  29. 29

    UDP数据包中的Jnetpcap有效负载修改

热门标签

归档