openpgp API并不是最直观易用的,但我试着去使用它(这是个双关语),下面是我的成果:
package main
import (
"bytes"
"code.google.com/p/go.crypto/openpgp/packet"
"encoding/hex"
"errors"
"fmt"
"io/ioutil"
"os"
)
var publicKeyHex string = "99[VERY LONG HEX STRING]B6"
func main() {
if len(os.Args) != 3 {
fmt.Println("Usage: " + os.Args[0] + " <file> <signature file>")
return
}
err := checkSig(os.Args[1], os.Args[2])
if err != nil {
fmt.Println("Invalid signature : ")
fmt.Println(err)
} else {
fmt.Println("Valid signature")
}
}
func checkSig(fileName string, sigFileName string) error {
fileContent, err := ioutil.ReadFile(fileName)
if err != nil {
return err
}
sigFile, err := os.Open(sigFileName)
if err != nil {
return err
}
defer func() {
if err := sigFile.Close(); err != nil {
panic(err)
}
}()
pack, err := packet.Read(sigFile)
if err != nil {
return err
}
signature, ok := pack.(*packet.Signature)
if !ok {
return errors.New(os.Args[2] + " is not a valid signature file.")
}
publicKeyBin, err := hex.DecodeString(publicKeyHex)
if err != nil {
return err
}
pack, err = packet.Read(bytes.NewReader(publicKeyBin))
if err != nil {
return err
}
publicKey, ok := pack.(*packet.PublicKey)
if !ok {
return errors.New("Invalid public key.")
}
hash := signature.Hash.New()
_, err = hash.Write(fileContent)
if err != nil {
return err
}
err = publicKey.VerifySignature(hash, signature)
if err != nil {
return err
}
return nil
}
根据要求,我将公钥放入代码中。
您可以像这样进行测试:
$ go run testpgp.go foo.bin foo.bin.sig
如果您签署的文件非常大,您可能需要稍微更改代码以避免在内存中加载它。
.sig
文件以验证签名。然后,crypto包应该具有您所需的所有方法。如果您找到关于.sig文件定义的文档(我没有找到),请在此处放置它。我也想看看。 - user983716