为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕村9548890 2023-06-01 17:01:40
是否可以使用 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.EntityListentityList = 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 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我遇到了与 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)

查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信