Расшифровка не ASCII-защищенного файла PGP в Go - PullRequest
0 голосов
/ 17 января 2019

Можно ли расшифровать двоичный файл .PGP с помощью библиотеки Go "golang.org/x/crypto/openpgp"?

Следующий код работает с защищенным ASCII-кодированным файлом, но выдает ошибку EOF с двоичным файлом PGP. Существует ли функция, аналогичная 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

}

1 Ответ

0 голосов
/ 10 июля 2019

Я столкнулся с той же самой проблемой с 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

...