Мне нужно расшифровать файл, который был зашифрован с помощью GnuPG с помощью ключа publi c и имеет отдельную подпись. Я пытался это для написания кода для расшифровки. Я могу расшифровать OpenPGP, зашифрованный с использованием личного ключа и парольной фразы, используя мой код, но я не смог заставить это работать для зашифрованного файла GnuPG, поскольку GnuPG делает что-то еще, например сжатие или изменение кодировки. Может кто-нибудь помочь, пожалуйста, как я могу программно расшифровать файл GnuPG в Go.
func (o *openPGPClient) Decrypt(reader io.Reader) (io.Reader, error) {
// Read public key into type EntityList.
entityList, err := openpgp.ReadArmoredKeyRing(o.privateKey)
if err != nil {
return nil, errors.Errorf("failed to read armored private key: %v", err)
}
// This assumes that only one entity is involved.
entity := entityList[0]
// Decrypt the private key with passphrase.
passphraseByte := []byte(o.passphrase)
if entity.PrivateKey != nil && entity.PrivateKey.Encrypted {
err = entity.PrivateKey.Decrypt(passphraseByte)
if err != nil {
return nil, errors.Errorf("failed to decrypt passphrase using private key: %v", err)
}
}
for _, subKey := range entity.Subkeys {
if subKey.PrivateKey != nil && subKey.PrivateKey.Encrypted {
err = subKey.PrivateKey.Decrypt(passphraseByte)
if err != nil {
return nil, errors.Errorf("failed to decrypt passphrase using sub key: %v", err)
}
}
}
// Decode the OpenPGP armored data to binary.
block, err := armor.Decode(reader)
if err != nil {
return nil, errors.Errorf("failed to decode openPGP armored data: %v", err)
}
// Decrypt data using the private key.
message, err := openpgp.ReadMessage(block.Body, entityList, nil, nil)
if err != nil {
return io.Reader(nil), errors.Errorf("failed to decrypt using private key: %v", err)
}
return message.UnverifiedBody, nil
}