Assinar e criptografar vs. Criptografar e assinar - O que o GPG faz?

Assinar e criptografar vs. Criptografar e assinar - O que o GPG faz?

Eu já li a discussãoDevemos assinar e criptografar ou criptografar e assinar?e o papelAssinatura e criptografia com defeito em S/MIME, PKCS#7, MOSS, PEM, PGP e XML. Minha pergunta tem a ver com o que o gpg está fazendo. Isso tem sido um pouco difícil de discernir empiricamente, uma vez que o resultado de:

gpg --encrypt --sign <filename>

Muda cada vez que eu executo. (Por que?)

@Jens explicou que parte do motivo é que um carimbo de data/hora está incluído. Existe alguma maneira de eliminar isso? Não estou vendo uma opção gpg.

Como a ordem das opções provavelmente não faz diferença, e como não posso usar a --detach-signopção (apenas um único arquivo de saída é produzido, independentemente), suspeito que a saída represente:

\begin{equation}
E_r (msg\  \| \ E_s (\#msg))
\end{equation}

onde $E_r$é a criptografia com a chave pública do destinatário, $E_s$é a criptografia com a chave privada do remetente, $msg$é a mensagem, $\#msg$é o hash da mensagem e $\|$é a concatenação.ou seja.isso seria “assinar a mensagem e depois criptografar”. Isso está correto?

Ou é em vez disso:

\begin{equation}
E_r (msg) \  \| \ E_s (\#msg)
\end{equation}

Em outras palavras, é “criptografar e assinar usando o texto simples?” Estou assumindo que énão“criptografar e assinar o texto cifrado”, ($E_r (msg) \ \| \ E_s (\# E_r (msg))$)pois isso seria contrário à Seção 1.2 do artigo mencionado acima.

@Jens explicou que é de fato “assinar a mensagem e depois criptografar”. Então, como poderíamos “criptografar e assinar usando o texto simples”, com a saída de um único arquivo openpgp, em vez de dois arquivos, um com os dados criptografados e o outro com a assinatura?

Além disso, li os jornais e os manuais - onde, além do próprio código, eu iria procurar isso?

@Jens sugeriu correr:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets 

Eu executei, criptografando para mim mesmo e encontrei a saída abaixo. Alguém poderia elucidar o que isso está nos dizendo?

[...]
gpg: okay, we are the anonymous recipient.
:encrypted data packet:
    length: unknown
    mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
:compressed packet: algo=2
:onepass_sig packet: keyid C6701618143AFA1E
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1443494042, name="",
    raw data: 4 bytes
:signature packet: algo 1, keyid C6701618143AFA1E
    version 4, created 1443494042, md5len 0, sigclass 0x00
    digest algo 10, begin of digest d7 3a
    hashed subpkt 2 len 4 (sig created 2015-09-29)
    subpkt 16 len 8 (issuer key ID C6701618143AFA1E)
    data: [4095 bits]

Responder1

Isso tem sido um pouco difícil de discernir empiricamente, uma vez que o resultado de:

gpg --encrypt --sign <filename>

muda cada vez que eu o executo. (Por que?)

Isto tem dois motivos:

  1. A criptografia simétrica no OpenPGP faz uso de um vetor de inicialização aleatório (ou melhor, uma construção semelhante com um vetor de inicialização fixo)
  2. O carimbo de data/hora de criação da assinatura está incluído.

Assinar e criptografar vs. Criptografar e assinar - O que o gpg faz?

O GnuPG primeiro assina uma mensagem e depois a criptografa. Você pode verificar isso usando gpg --list-packets:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets

Que primeiro assina e depois criptografa uma mensagem, conforme indica a ordem dos pacotes.

Do meu entendimentoRFC 4880, OpenPGP, porém, ambas as ordens são definidas: as mensagens OpenPGP podem ser assinaturas, dados criptografados, compactados e literais, enquanto as assinaturas são aplicadas em mensagens OpenPGP, e as mensagens descriptografadas também devem formar mensagens OpenPGP.

informação relacionada