Как я могу расшифровать файл, зашифрованный с помощью GnuPG? - PullRequest
0 голосов
/ 11 апреля 2020

GnuPG Encrypted File Content Мне нужно расшифровать файл, который был зашифрован с помощью 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
}
...