gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:01:02 26 4
gpt4 key购买 nike

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

最佳答案

我遇到了与 PGP 完全相同的问题,在我的第一次试用中也遇到了 EOF。

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

key 环装甲文件(.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

关于go - 在 Go 中解密非 ASCII 装甲 PGP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54233076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com