繁体   English   中英

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

[英]Decrypting a non ASCII armored PGP file in Go

是否可以使用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

}

我在使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM