在Go中解密非ASCII装甲的PGP文件

时间:2019-01-17 09:46:53

标签: go openpgp

是否可以使用Go的“ golang.org/x/crypto/openpgp”库解密二进制.PGP文件?

以下代码可用于装甲ASCII编码文件,但对于二进制PGP文件会引发EOF错误。是否有与armour.Decode()类似的功能可以解密二进制文件?

func DecryptFile(encryptedFilePath string, decryptedFilePath string) error {
pubKey := decodePublicKey()
privKey := decodePrivateKey()

entity := createEntityFromKeys(pubKey, privKey)

file := readFile(encryptedFilePath)

block, err := armor.Decode(file)
if err != nil {
    log.Printf("Error reading OpenPGP Armor: %s", err)
    return err
}

if block.Type != "Message" {
    log.Println("Invalid message type")
    return err
}

var entityList openpgp.EntityList
entityList = append(entityList, entity)

messageDetails, err := openpgp.ReadMessage(block.Body, entityList, nil, nil)
if err != nil {
    log.Printf("Error reading message: %s", err)
    return err
}

compressed, err := gzip.NewReader(messageDetails.UnverifiedBody)
if err != nil {
    log.Printf("Invalid compression level: %s", err)
    return err
}
defer compressed.Close()

buffer := bytes.NewBuffer(nil)

n, err := io.Copy(buffer, compressed)
if err != nil {
    log.Printf("Error reading encrypted file: %s", err)
    return err
}

err = ioutil.WriteFile(decryptedFilePath, buffer.Bytes(), 0644)
if err != nil {
    log.Println(err)
    return err
}

log.Printf("Decrypted %d bytes\n", n)

return nil

}

1 个答案:

答案 0 :(得分:2)

我在使用PGP时遇到了同样的问题,在第一次试用中也遇到了EOF。

加密文件为二进制(.pgp)

密钥环防护文件(.asc)中的私钥/公钥,如下所示:

----BEGIN PGP PUBLIC KEY BLOCK-----

-----END PGP PRIVATE KEY BLOCK-----

这是我使用的代码:

keyRing, err := os.Open("keyArmoredFile.asc")
if err != nil {
    log.Fatal(err)
}

entityList, err := openpgp.ReadArmoredKeyRing(keyRing)
if err != nil {
    log.Fatal(err)
}

entity := entityList[0]
passphraseByte := []byte("password")
err = entity.PrivateKey.Decrypt(passphraseByte)
if err != nil {
    log.Fatal(err)
}
for _, subkey := range entity.Subkeys {
    subkey.PrivateKey.Decrypt(passphraseByte)
}

encryptedContent, err := os.Open("encryptedFile.pgp")
if err != nil {
    log.Fatal(err)
}

md, err := openpgp.ReadMessage(encryptedContent, entityList, nil, nil)
if err != nil {
    log.Fatal(err)}

bytes, err := ioutil.ReadAll(md.UnverifiedBody)
if err != nil {
    log.Fatal(err)
}

// decryption result
decStr := string(bytes)

参考: https://gist.github.com/stuart-warren/93750a142d3de4e8fdd2