我想用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 }