猿问

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

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


以下代码适用于装甲 ASCII 编码文件,但会抛出二进制 PGP 文件的 EOF 错误。是否有类似于 armor.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

}


慕村9548890
浏览 110回答 1
1回答

qq_笑_17

我遇到了与 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 resultdecStr := string(bytes)
随时随地看视频慕课网APP

相关分类

Go
我要回答