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-sign
opçã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:
- 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)
- 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.