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()
}
}
相关文章
- 使用delve调试Golang程序
- Golang实现的TOTP算法
- golang调用c动态库
- golang 实现广度优先算法(走迷宫)
- golang 使用pprof进行性能调优
- Golang:使用标准库crypto/aes实现AES加密和解密
- 【GoLang】golang 如何像Java 一样通过类名反射对象?
- 【GoLang】50 个 Go 开发者常犯的错误
- GoLang测试那些事儿
- GoLang使用Goroutine+Channel实现流水线处理,扇入扇出思想解决流水线上下游供需不平衡
- 理解golang调度之一 :操作系统调度
- 保姆级别的RabbitMQ教程!一看就懂!(有安装教程,送安装需要的依赖包,送Java、Golang两种客户端教学Case) (二)
- Go_15:GoLang中面向对象的三大特性
- [golang][译]使用os/exec执行命令
- golang-指针
- golang之匿名函数
- 如何使用gitlab自建golang基础库
- go语言的包管理工具(golang module)详解与实践
- 学习build-web-application-with-golang第四章内容
- Golang gRPC 使用
- golang从简单的即时聊天来看架构演变