Firmar y cifrar frente a cifrar y firmar: ¿qué hace GPG?

Firmar y cifrar frente a cifrar y firmar: ¿qué hace GPG?

Ya leí la discusión.¿Deberíamos firmar y luego cifrar o cifrar y luego firmar?y el papelFirma y cifrado defectuosos en S/MIME, PKCS#7, MOSS, PEM, PGP y XML. Mi pregunta tiene que ver con lo que está haciendo gpg. Esto ha sido un poco difícil de discernir empíricamente, desde el resultado de:

gpg --encrypt --sign <filename>

Cambia cada vez que lo ejecuto. (¿Por qué?)

@Jens ha explicado que parte del motivo es que se incluye una marca de tiempo. ¿Hay alguna manera de eliminar eso? No veo la opción gpg.

Como presumiblemente el orden de las opciones no hace ninguna diferencia, y dado que no puedo usar la --detach-signopción (de todos modos, solo se produce un único archivo de salida), sospecho que la salida representa:

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

donde $E_r$es cifrado con la clave pública del destinatario, $E_s$es cifrado con la clave privada del remitente, $msg$es el mensaje, $\#msg$es el hash del mensaje y $\|$es la concatenación.es decir.esto sería "firmar el mensaje y luego cifrar". ¿Es esto correcto?

¿O es en cambio:

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

En otras palabras, ¿se trata de “cifrar-y-luego-firmar-usando-el-texto-sin-plano?” estoy asumiendo que esno"cifrar-luego-firmar-el-texto-cifrado", ($E_r (msg) \ \| \ E_s (\# E_r (msg))$)ya que eso iría en contra de la Sección 1.2 del documento mencionado anteriormente.

@Jens ha explicado que en realidad se trata de "firmar el mensaje y luego cifrar". Entonces, ¿cómo podríamos “cifrar-luego-firmar-usando-el-texto-sin formato”, con el resultado de un único archivo openpgp, en lugar de dos archivos, uno con los datos cifrados y el otro con la firma?

Además, leí los artículos y los manuales. ¿Dónde, además del código en sí, iría a buscar esto?

@Jens sugirió ejecutar:

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

Lo ejecuté, me cifré y encontré el siguiente resultado. ¿Alguien podría aclarar qué nos está diciendo?

[...]
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]

Respuesta1

Esto ha sido un poco difícil de discernir empíricamente, desde el resultado de:

gpg --encrypt --sign <filename>

cambia cada vez que lo ejecuto. (¿Por qué?)

Esto tiene dos razones:

  1. El cifrado simétrico en OpenPGP utiliza un vector de inicialización aleatorio (o más bien, una construcción similar con un vector de inicialización fijo)
  2. Se incluye la marca de tiempo de creación de la firma.

Firmar y cifrar frente a cifrar y firmar: ¿qué hace gpg?

GnuPG primero firma un mensaje y luego lo cifra. Puedes verificar esto usando gpg --list-packets:

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

El cual primero firma y luego cifra un mensaje, tal y como indica el orden de los paquetes.

Desde mi entendimiento deRFC 4880, OpenPGPSin embargo, ambos órdenes están definidos: los mensajes OpenPGP pueden ser firmas, datos cifrados, comprimidos y literales, mientras que las firmas se aplican a los mensajes OpenPGP y los mensajes descifrados también deben formar mensajes OpenPGP.

información relacionada