Como consultar todas as chaves OpenPGP do destinatário com o GnuPG?

1

Não consigo encontrar um método confiável para perguntar a gpg a lista de chaves (públicas) usadas para criptografar um determinado arquivo. Uma solução plausível não funciona para mim - nunca lista a minha chave:

gpg --list-only --no-default-keyring --secret-keyring /dev/null $testfile

Outra solução que derivou de este tópico é a multi-etapa e, sem dúvida, tem algum caso de canto que mostrará sua fragilidade:

(gpg -vv --list-only $testfile  2>&1 | grep 'gpg: public key' | awk '{print $NF}' | xargs -L1 gpg --list-keys --with-colons) | egrep '^pub' | awk -F: '{print $5}'

Depois de cavar mais, tenho outra opção em potencial que envolve enganar gpg de maneiras que são, sem dúvida, frágeis ao longo do tempo:

gpg --dry-run --pinentry-mode cancel --output /dev/null "$testfile" 2>&1

Alguém tem uma solução melhor do que qualquer um desses?
Alguém sabe porque a óbvia opção --list-only não faz a coisa "certa"?

Caso seja importante, use gpg (GnuPG) 2.1.10 no Mac OS X e gpgv (GnuPG) 2.0.26 no Debian (Jessie).

    
por eggo 04.03.2016 / 16:50

1 resposta

2

A maneira mais segura é listar os pacotes OpenPGP. Você pode usar o comando --list-packets do GnuPG ou a ferramenta separada pgpdump . Você só terá subchaves; as chaves primárias não são referenciadas na mensagem criptografada. Se você quiser consultar as chaves primárias, você terá que resolvê-las através do chaveiro local (ou no caso de estarem ausentes, um servidor de chaves) separadamente.

Para um documento criptografado em duas subchaves minhas, a saída é assim ( --list-only adicionado, então o GnuPG não consulta a senha, se disponível):

$ gpg2 --list-only --list-packets < encrypted.gpg
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CC73B287A4388025
    data: [4090 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=268
:pubkey enc packet: version 3, algo 1, keyid 5C88F5D83E2554DF
    data: [2048 bits]
# off=798 ctb=d2 tag=18 hlen=2 plen=63 new-ctb
:encrypted data packet:
    length: 63
    mdc_method: 2

Isso listará todos os destinatários (conhecidos). Se destinatários ocultos forem usados, obviamente isso não será possível:

# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
    data: [4093 bits]

Saída semelhante para pgpdump :

Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
    New version(3)
    Key ID - 0x0000000000000000
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(4096 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
    New version(3)
    Key ID - 0x5C88F5D83E2554DF
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(2047 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
    Ver 1
    Encrypted data [sym alg is specified in pub-key encrypted session key]
        (plain text + MDC SHA1(20 bytes))

Infelizmente, nenhum deles tem saída estável e bem definida. A opção --with-colon do GnuPG não está disponível para pacotes de despejo.

O GnuPG só imprime as chaves outras , não as suas (sem --list-only , ele tentaria usar a chave). Se esse comportamento é intencional e desejável pode ser objeto de debate, passar um único -v / --verbose parece ser suficiente para listar suas próprias chaves.

O problema com sua primeira tentativa ao tentar "ocultar" suas chaves secretas é um problema com a instrução --no-default-keyring . De man gpg2 :

--no-default-keyring

Do not add the default keyrings to the list of keyrings. Note that GnuPG will not operate without any keyrings, so if you use this option and do not provide alternate keyrings via --keyring or --secret-keyring, then GnuPG will still use the default public or secret keyrings.

O GnuPG sempre lê o chaveiro público. Apenas passar um chaveiro secreto ilegível / vazio não é suficiente, em vez disso apenas passar um chaveiro público é bom:

gpg2 --no-default-keyring --keyring /dev/null --list-only
    
por 04.03.2016 / 23:33