Si un atacante obtiene un archivo que se ha cifrado con una clave pública de OpenPGP, ¿qué información puede deducir el atacante?
Por ejemplo, ¿a qué grado de certeza puede el atacante deducir la identidad del destinatario deseado?
La ID de clave del destinatario se incluye en texto sin formato en el archivo cifrado. Otra información posiblemente interesante "oculta a simple vista" es solo el tamaño del archivo, o el nombre del archivo encriptado (si alguien lo envía sin alteración, por supuesto).
Lo que podría no darse cuenta es que la ID de clave del destinatario es efectivamente un campo opcional. La Sección 5.1 continúa diciendo:
Una implementación PUEDE aceptar o usar una ID de clave de cero como "comodín" o ID de clave "especulativa". En este caso, la implementación receptora. probaría todas las claves privadas disponibles, buscando un descifrado válido clave de sesión Este formato ayuda a reducir el análisis del tráfico de los mensajes.
Puede cifrar utilizando el indicador -R
(o --hidden-recipient
) con gpg
para evitar revelar la clave pública del destinatario en un mensaje cifrado.
$ gpg -e -R [email protected] message.txt
$ $ gpg --verbose --verbose --decrypt message.txt.gpg
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
data: [2047 bits]
gpg: public key is 00000000
gpg: anonymous recipient; trying secret key aaaaaaaa ...
gpg: anonymous recipient; trying secret key bbbbbbbb ...
gpg: anonymous recipient; trying secret key cccccccc ...
:encrypted data packet:
length: 76
mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
gpg: decryption failed: secret key not available
$
En este punto, gpg
itera a través de todas las claves privadas que intenta obtener una clave de sesión válida, ya que no puede identificar la clave pública utilizada para el cifrado. Sin embargo, también vea esta respuesta para encontrar formas de diferenciar entre los destinatarios si el atacante tiene acceso a una gran cantidad de mensajes.
Un lado práctico - las pistas secundarias pueden estar en varios registros. Por ejemplo, un atacante que obtiene un mensaje de este tipo también podría acceder (por ejemplo) a un archivo .bash_history
con la dirección del destinatario, o al registro de un servidor web con direcciones IP que brindan pistas sobre quién envió POST'ed o GET el archivo. , etc.
Según el RFC para el formato de mensaje OpenPGP, sección 5.1 , todos los mensajes cifrados de OpenPGP contienen en al menos un paquete de clave de sesión cifrada de clave pública, que a su vez contiene esta información de texto simple:
Si se han especificado múltiples destinatarios, existirán varios Paquetes de claves de sesión cifradas de clave pública, uno para cada destinatario previsto.
Entonces, en resumen, un atacante puede reducir la identidad del destinatario deseado en función de un mensaje cifrado OpenPGP.
Puedes probarlo de forma experimental intentando descifrar un archivo en el que no tienes la clave pública. Como puede ver, las ID de clave de los destinatarios deseados, así como el nombre del algoritmo y el número de versión:
$ gpg --encrypt -r '<[email protected]>' -r '<[email protected]>' --sign message.txt
$ GNUPGHOME=/tmp/empty gpg --verbose --verbose --decrypt message.txt.gpg
:pubkey enc packet: version 3, algo 16, keyid 9759103664E69CC1
data: [2048 bits]
data: [2047 bits]
gpg: public key is 64E69CC1
:pubkey enc packet: version 3, algo 16, keyid 9478F6114164312C
data: [2048 bits]
data: [2048 bits]
gpg: public key is 4164312C
:encrypted data packet:
length: 171
mdc_method: 2
gpg: encrypted with ELG-E key, ID 4164312C
gpg: encrypted with ELG-E key, ID 64E69CC1
gpg: decryption failed: secret key not available
Esta es la información de texto sin formato que está disponible. No sé si es otra información que pueda deducirse estadísticamente.
Lea otras preguntas en las etiquetas pgp