¿Qué sucede cuando verificas una firma separada?

¿Qué sucede cuando verificas una firma separada?

Estoy tratando de entender qué sucede al verificar una firma gpg separada.

Aquí hay un ejemplo del gnupg.manual:

blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun  4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"

¿Cómo determina gpg que la firma es buena? ¿La firma contiene un hash del archivo firmado? Si es así, ¿cómo se extrae ese hash de la propia firma?

Lo intenté gpg --list-packets <signature>pero no parece mostrar la información completa.

Respuesta1

Puede utilizar la --list-packetsopción para obtener un volcado de lo que hay en un archivo gpg. La descripción del formato de archivo esRFC 4880(Estándar OpenPGP).

La firma no contiene directamente un hash. Contiene información que permite verificar tanto el hash como el remitente: hay unalgoritmo de verificación de firma, que toma un valor hash y una clave pública como entrada y devuelveoNo; el algoritmo regresasi la firma se realizó mediante la clave privada correspondiente a la clave pública dada de un mensaje con la clave privada dada, y devuelveNoen todas las demás circunstancias (firma de un hash diferente, firma realizada con una clave diferente o un grupo de bytes que no pueden ser una firma en absoluto). Bajo laDSAalgoritmo, creo que es inviable extraer el hash de una firma si no tienes la clave privada.

El archivo de firma contiene la identidad del firmante así como el valor de la firma. Para verificar la firma, gpg lee la clave pública del firmante de su conjunto de claves, calcula el hash de los datos y aplica el algoritmo de verificación de firma.

Respuesta2

$ gpg --list-packets myfile.asc
[...]
       digest algo 10, begin of digest 77 dd

Esto le muestra qué algoritmo de resumen se utilizó. Lamentablemente ni la página de manual ni gpg --versionnos dice qué algoritmo está asignado a qué ID. Necesitamos sumergirnos en el RFC del formato de paquete para encontrar esta información:https://www.rfc-editor.org/rfc/rfc4880#section-9.4

ID           Algorithm                             Text Name
--           ---------                             ---------
1          - MD5 [HAC]                             "MD5"
2          - SHA-1 [FIPS180]                       "SHA1"
3          - RIPE-MD/160 [HAC]                     "RIPEMD160"
4          - Reserved
5          - Reserved
6          - Reserved
7          - Reserved
8          - SHA256 [FIPS180]                      "SHA256"
9          - SHA384 [FIPS180]                      "SHA384"
10         - SHA512 [FIPS180]                      "SHA512"
11         - SHA224 [FIPS180]                      "SHA224"
100 to 110 - Private/Experimental algorithm

Respuesta3

Sí, las firmas digitales suelen ser hashes seguros, que están firmados mediante la clave secreta del firmante.

Firmar el mensaje completo es mucho más lento y no más seguro. Además, el algoritmo debe cuidar la longitud de los bloques, el relleno (de manera que no revele demasiada información), etc.

Nota: también en el cifrado asimétrico, por razones de velocidad, solo se cifra asimétricamente una clave simétrica efímera y el resto del mensaje solo se cifra simétricamente.

información relacionada