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

3

Eu já li a discussão Devemos assinar-então-criptografar, ou criptografar-depois-assinar? e o papel Sinal com defeito & Criptografar 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, desde a saída de:

gpg --encrypt --sign <filename>

Altera cada vez que eu o executo. (Por quê?)

@Jens explicou que parte do motivo é que um timestamp é incluído. Existe alguma maneira de eliminar isso? Eu não estou vendo uma opção de gpg.

Como a ordem das opções presumivelmente não faz diferença, e como não posso usar a opção --detach-sign (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}

em que $E_r$ é criptografia com a chave pública do destinatário, $E_s$ é criptografia com a chave privada do remetente, $msg$ é a mensagem, $\#msg$ é o hash da mensagem e $\|$ é concatenação. ie. isto seria "assine-a-mensagem-então-criptografe". Isto está correto?

Ou é em vez disso:

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

Em outras palavras, é "criptografar, em seguida, assinar usando o texto simples"? Estou assumindo que não é "encrypt-then-sign-the-cyphertext" ($E_r (msg) \ \| \ E_s (\# E_r (msg))$) , pois isso seria contrário à Seção 1.2 do documento mencionado acima.

@Jens explicou que é de fato “sign-the-message-then-encrypt”. Então, como é que vamos “criptografar, em seguida, assinar usando o texto simples”, com a saída de um único arquivo openpgp , em vez de dois arquivos, um dos dados criptografados e outro a assinatura?

Além disso, li os artigos & Eu li os manuais - onde, além do próprio código, eu procuraria isso?

@Jens sugeriu correr:

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

Eu o executei, criptografando para mim mesmo e encontrei a saída abaixo. Alguém poderia elucidar o que 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]
    
por Diagon 27.09.2015 / 22:57

1 resposta

5

This has been a bit difficult to discern empirically, since the output of:

gpg --encrypt --sign <filename>

changes each time I run it. (Why?)

Isso tem dois motivos:

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

Sign & Encrypt vs. Encrypt & Sign - What does gpg do?

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

Quais os primeiros sinais e depois criptografa uma mensagem, como a ordem dos pacotes indica.

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

    
por 27.09.2015 / 23:36