前端之家收集整理的这篇文章主要介绍了
无法使用golang的openpgp数据包签署有效的gpg密钥,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
502_0@
我想用goc语言中的私钥从ascii armor签名公钥.为此我开发了以下
代码,但问题是当我检查gpg中的签名时–check-sigs由
代码创建的签名
显示为“bad签名“.请帮助,因为我无法弄清楚任何
解决问题的
方法.我已经发布了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 ",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
}