Generate keypairs
gpg --full-generate-key
# use any email, i used [email protected], passphrase=123456
$ gpg --output public.pgp --armor --export [email protected]
$ gpg --output private.pgp --armor --export-secret-key [email protected]
$ gpg --list-keys
$HOME/.gnupg/pubring.kbx
--------------------------------
pub rsa2048 2023-05-11 [SC]
52FCDCD73A663460A86839AF49A3059CC639E767
uid [ultimate] user1 <[email protected]>
sub rsa2048 2023-05-11 [E]
$ gpg --list-secret-keys
$HOME/.gnupg/pubring.kbx
--------------------------------
sec rsa2048 2023-05-11 [SC]
52FCDCD73A663460A86839AF49A3059CC639E767
uid [ultimate] user1 <[email protected]>
ssb rsa2048 2023-05-11 [E]
main.go
package main
import (
"bytes"
"fmt"
"io/ioutil"
"strings"
"os"
"golang.org/x/crypto/openpgp"
"golang.org/x/crypto/openpgp/armor"
"golang.org/x/crypto/openpgp/packet"
)
const (
publicKeyring = "public.pgp"
secretKeyring = "private.pgp"
secretString = "foooo"
passphrase = "123456"
)
var ()
func main() {
f, err := os.Open(publicKeyring)
if err != nil {
panic(err)
}
defer f.Close()
block, err := armor.Decode(f)
if err != nil {
panic(err)
}
entity, err := openpgp.ReadEntity(packet.NewReader(block.Body))
if err != nil {
panic(err)
}
keyringFileBuffer, err := os.Open(secretKeyring)
if err != nil {
panic(err)
}
defer keyringFileBuffer.Close()
keyRing, err := openpgp.ReadArmoredKeyRing(keyringFileBuffer)
if err != nil {
panic(err)
}
for _, k := range keyRing {
fmt.Printf("KeyIDs found in keyring: %d\n", k.PrimaryKey.KeyId)
}
passphraseByte := []byte(passphrase)
fmt.Println("Decrypting private key using passphrase")
for _, subkey := range keyRing[0].Subkeys {
err = subkey.PrivateKey.Decrypt(passphraseByte)
if err != nil {
panic(err)
}
}
// Encrypt/Decrypt
buf := new(bytes.Buffer)
msg, err := armor.Encode(buf, "PGP MESSAGE", nil)
if err != nil {
panic(err)
}
w, err := openpgp.Encrypt(msg, []*openpgp.Entity{entity}, nil, &openpgp.FileHints{IsBinary: false}, nil)
if err != nil {
panic(err)
}
_, err = w.Write([]byte(secretString))
if err != nil {
panic(err)
}
err = w.Close()
if err != nil {
panic(err)
}
err = msg.Close()
if err != nil {
panic(err)
}
bc, err := ioutil.ReadAll(buf)
if err != nil {
panic(err)
}
//encStr := base64.StdEncoding.EncodeToString(bc)
fmt.Printf("Encrypted Secret: \n%s\n", bc)
//*****************************
block, err = armor.Decode(bytes.NewBuffer(bc))
if err != nil {
panic(err)
}
md, err := openpgp.ReadMessage(block.Body, keyRing, nil, nil)
if err != nil {
panic(err)
}
bb, err := ioutil.ReadAll(md.UnverifiedBody)
if err != nil {
panic(err)
}
decStr := string(bb)
fmt.Printf("decrypted: %s\n", decStr)
// SIGN/VERIFY
message := bytes.NewBufferString(secretString)
var signingEntity *openpgp.Entity
for _, subkey := range keyRing {
err = subkey.PrivateKey.Decrypt(passphraseByte)
if err != nil {
panic(err)
}
signingEntity = subkey
}
out := new(bytes.Buffer)
err = openpgp.ArmoredDetachSign(out, signingEntity, message, nil)
if err != nil {
panic(err)
}
sig := out.Bytes()
fmt.Printf("Signed: \n%s\n", sig)
pkeyRing := openpgp.EntityList{}
pkeyRing = append(pkeyRing, entity)
myReader := strings.NewReader(secretString)
ee, err := openpgp.CheckArmoredDetachedSignature(pkeyRing, myReader, bytes.NewReader(sig))
if err != nil {
panic(err)
}
for _, s := range ee.Identities {
fmt.Printf("Signature Verified: \n%s\n", s.Name)
}
}
public.pgp
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBGRc5PABCADgq4Y0sO57me+U78NvLSEO26Qn5x0Ufp2opzCVOMsro5oJS0st
b/Fgq7AnZ3E1TsRXYx9b5U9HweP6N1eiONmHf3EcjUfMbtXFMY0QtmCEQFAEPoM6
g1w1nbMgMg63TDCnI/80twmheoGr3MBdYYnpCUgcQfzdsP5dN9TY3Bz8HMQ76k5W
0GHdYee9nJRvk7ehsqWI5KaFPro8p00TRR2froriZvqskR7XtWPtLq9YrwUNGuQW
gC4L35+TX7LvGrMwUZae32/S1UyA+k7DYV6J2k+c72cF9wX1iSSqlUQf21Rxey11
6nMLlhr78M2kMjgLFRXumo3TLxqQPzh9g1OFABEBAAG0GHVzZXIxIDx1c2VyMUBk
b21haW4uY29tPokBTgQTAQoAOBYhBFL83Nc6ZjRgqGg5r0mjBZzGOednBQJkXOTw
AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEEmjBZzGOednot4IAN0eqC5T
1xc6iTINykHSjrGpWTtO9hzYw5V67voA9KW7S/oAx2IOyjebHNhzlB1tu0g6qBTA
YBikFIheALk/KTg5KwQth76Jj4aVsj+yTtF1A65U3zRcq4X8N1X5bE0LJRsqbGsO
5yYFFSezAja6UX0p+dnfQlctX6gI2VUZtfbuO6QUXTLpxGVzWKTaPAKgWuMMLIWB
vD4E0GYBzoeCK4t4G0ImXR2NrsRIhXiMCzYIXELs9xzSEAQ2UuVt5YaLDk6adcrL
TWl/o32m8komAUFhMHeN0FKTfaDKP4bLfm4GOxFNzn1nvJUyS7GMYmHmZTm6BspQ
d0Kq6gEO4oyrXs65AQ0EZFzk8AEIALuS9wj6oilSG/ch6MPuv3b5u4XAua9F93dz
mf5nKiNOZcMj7udesvnmP5pKjbEp/MDmPyhr6DFsajwcPuecvzlx8Ygwt6LSXKL8
79OFZaUU/PDm8c5nUn3t8upcoGtkTHPpVzKh/2FqGTJV6oXt/iWVjBAVgnsXZjlb
obiIduCuWLoZKXwCWcdagZksIK/D9ryvMfd9vCzKWZHRb0FjcXjH0cpvA8/cffIG
XERSLnA4G3JgU+FGCyMsi64fxGCPz+ZYXMmgzpNDO3yLnYMdIgqLfXLlWGUfTA1I
UmVV7NlWDskhNOZQLnFLq7uTMbKWMyvvODHNDHnm5xWqcsaPBIEAEQEAAYkBNgQY
AQoAIBYhBFL83Nc6ZjRgqGg5r0mjBZzGOednBQJkXOTwAhsMAAoJEEmjBZzGOedn
wEgH/1lTp2rTePvcHUCWIB06ALRnv7nhJV6KA7ziLVEUtkNaS9FjRUJaBHe6Bk5r
vTyR34wa3WBA9xz72OgL1ljEViIeqsG1nu97QNMt9JDvJ1EB4Ifz9g15AfoG4E0Z
6YBsZ4EogdJhg+Y0FhVSuO4mtSD1UpJxfKcWm/q9gEVh4+wx/TpME3YkfyLQeLy+
v27NiUOh5tRqtsPow9saw2PUWeNCIGEVSBHClmCggJ5r7WCm/+K9t3n5s2DQyv3M
ia7ATGBxQ/PjP1TDRGGuPeI4EeGp5AhDvt6JAuGIPuKEGgvOXFEuVDzy0jK9HI/H
AFRv1UWpNe13HmZnDn394No19O8=
=pKip
-----END PGP PUBLIC KEY BLOCK-----
private.pgp
-----BEGIN PGP PRIVATE KEY BLOCK-----
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
j8cAVG/VRak17XceZmcOff3g2jX07w==
=1PiZ
-----END PGP PRIVATE KEY BLOCK-----
$ go run main.go
KeyIDs found in keyring: 5306090956871296871
Decrypting private key using passphrase
Encrypted Secret:
-----BEGIN PGP MESSAGE-----
wcBMA8pAO4LQ+CtyAQgAexlPQKSB1sx+HC5ZegDL4Z/Jb2wu4kVE6a96BKEEaXky
XS4+ycVVxW4MU1/e6pw4BQSg/ZOqDk89ePIuasXm7UDA3Op4VWYScXHALnYXDnQZ
37cdW26ehkYJgNUVpi01O+UVKEV+p5mNn6xOjRYbTSSvHA5AWD9bC16TjWyFS//w
+r4LXhHEH9E1sHfD1pZgYkdKLcZZ4Voo7Pay282Zrp92rFGvrMGYh6FHrF3ZfcWo
sfA4Ifg+OtgDAdJePa37j1nnUo4UabyRbjl10ERUFeU17Bd5sBejxvAfD3wy/RJi
WmvC+j/PMgWCWp+x5VtX940CQlZ97HmTn2n2ww8xQtLgAeQHHfXkW31tv8NN353e
60s84dQA4F7gmOF+cOBr4geQ95fgluJSaw2c4CLgbeCc5PHtLb3a6FKQnxuI2jsa
cS/iTOxKtuFidgA=
=OXqU
-----END PGP MESSAGE-----
decrypted: foooo
Signed:
-----BEGIN PGP SIGNATURE-----
wsBcBAABCAAQBQJkXOsjCRBJowWcxjnnZwAAzWYIANISDHilfOVXW60yKU0bjbD8
DuL455IGJjBnsA1yx7jQM0Yj8alYk20aiDMk+S4WUfG9WKcGYDWFQdZGp0YiMl8B
WMzUbrwoVhazRd/6lvOJ4r1lbqBSUGXs9GtuvEUW8vjOr/6LzecBLBV8EXivT2Xz
eT4S3UV68O57zkKpUqGGzp5oT+4JjtMTODuNczz59i+Rk174Eiy1EqQBbEYrIC3e
4W7xjWu+fdq5d2Xz/iuJJRy6O7VI/l/uK/rU3eScqE/YTHbhgdwzUnRCRczFQ2cI
UOi/u/pm6VvE+8FbIYprhibDESh6BNAtcvrZ2g45p2+XwPjsk6kQe8Ar/IcqBhU=
=uYRp
-----END PGP SIGNATURE-----
Signature Verified:
user1 <[email protected]>