zl程序教程

您现在的位置是:首页 >  工具

当前栏目

golang使用opengpg

Golang 使用
2023-09-27 14:20:11 时间

来源于github

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strings"

	"golang.org/x/crypto/openpgp"
	"golang.org/x/crypto/openpgp/armor"
	"golang.org/x/crypto/openpgp/packet"
)

// command to generatepublic key in desired format:  gpg --output public.pgp --export your@mail.com
const (
	publicKey = "public.pgp"
	helderKey = "helderPrivateKey.asc"
)

func main() {

	// source file
	sourceBytes, err := ioutil.ReadFile("a1.pdf")

	// destination file
	dst, err := os.Create("a5.pdf.gpg")
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	//read public key
	entityKey, err := readEntity()
	if err != nil {
		fmt.Println(err)
	}

	// encrypt
	erro := encryptFile([]*openpgp.Entity{entityKey}, nil, sourceBytes, dst)

	if erro != nil {
		fmt.Println(erro)
	}

	// decrypt
	decryptFile()

}

func readEntity() (*openpgp.Entity, error) {
	f, err := os.Open(publicKey)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	block, err := armor.Decode(f)
	if err != nil {
		return nil, err
	}
	return openpgp.ReadEntity(packet.NewReader(block.Body))
}

func encryptFile(recip []*openpgp.Entity, signer *openpgp.Entity, r []byte, w io.Writer) error {
	// init some vars
	var entity *openpgp.Entity
	var entityList openpgp.EntityList

	// Open the private key file
	keyringFileBuffer, err := os.Open(helderKey)
	if err != nil {
		fmt.Println(err)
	}
	defer keyringFileBuffer.Close()
	entityList, err = openpgp.ReadKeyRing(keyringFileBuffer)
	if err != nil {
		fmt.Println(err)
	}
	entity = entityList[0]

	passphraseByte := []byte("XXXXXXXXXX")

	entity.PrivateKey.Decrypt(passphraseByte)
	for _, subkey := range entity.Subkeys {
		subkey.PrivateKey.Decrypt(passphraseByte)
	}

	sourceText := string(r)
	wc, err := openpgp.Encrypt(w, recip, entity, &openpgp.FileHints{IsBinary: true}, nil)

	if err != nil {
		return err
	}

	if _, err := io.Copy(wc, strings.NewReader(sourceText)); err != nil {
		return err
	}

	return wc.Close()
}

func decryptFile() error {
	dst, err := os.Open("a6.pdf.sig")
	if err != nil {
		panic(err)
	}
	defer dst.Close()

	// init some vars
	var entityList openpgp.EntityList

	// Open the public key file
	keyringFileBuffer, err := os.Open(publicKey)
	if err != nil {
		fmt.Println(err)
	}
	defer keyringFileBuffer.Close()
	entityList, err = openpgp.ReadKeyRing(keyringFileBuffer)
	if err != nil {
		fmt.Println(err)
	}

	md, err := openpgp.ReadMessage(dst, entityList, nil, nil)
	if err != nil {
		fmt.Println(err)
	}

	entity := md.SignedBy.Entity

	for key := range entity.Identities {
		fmt.Println("Key:", key)
	}

	ww, err := os.Create("a8.pdf")
	if err != nil {
		panic(err)
	}
	defer ww.Close()
	if _, err := io.Copy(ww, md.UnverifiedBody); err != nil {
		fmt.Println(err)
	}

	return nil
}

func signFile(input []byte, output io.Writer, myEntity *openpgp.Entity) error {
	if writeCloser, err := openpgp.Sign(output, myEntity, &openpgp.FileHints{IsBinary: true}, nil); err != nil {
		return err
	} else {
		writeCloser.Write(input)
		return writeCloser.Close()
	}
}