rsa hash cifrado == firma rsa

4
$ echo -n "1327943823" > test_ok.txt
$ openssl dgst -sha1 -binary -out test_ok.sha1 test_ok.txt

$ echo "GURbsl4CFPCG83RCZxsEpoRleXicXQhH1OC4Fk77b7EMj2g8aHUhD/L+sm
oGSVpuEwup1fmkZBADXwBel8UKsmxgTLRX+vlGgyTr1XPqqHFNjtL33fd5
7NuKBqaJjwSp7D5xVMeVdQtQQbsKuKx5AvOPPyZfdtdyoJw/all1tl4=" > test_ok.sig.64
$ base64 -D -i test_ok.sig.64 -o test_ok.sig

$ openssl rsautl -verify -inkey test.pub -pkcs -pubin -in test_ok.sig -out 
test_ok.sha1.calc

$ hexdump test_ok.sha1
0000000 08 a8 55 9c d4 43 f9 cb ec 9f 04 f4 f2 dc aa 1f
0000010 7f e9 e1 11                                    
0000014

$ hexdump test_ok.sha1.calc
0000000 30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 08
0000010 a8 55 9c d4 43 f9 cb ec 9f 04 f4 f2 dc aa 1f 7f
0000020 e9 e1 11                                       
0000023

test_ok.sha1.calc es un objeto codificado en ASN.1 que contiene un hash sha1 que coincide con el de test_ok.sha1.

Todo está bien y genial, pero ...

$ openssl dgst -sha1 -verify test.pub -signature test_ok.sig test_ok.txt

Eso también coincide.

Mi pregunta es ... ¿con qué frecuencia van a coincidir el hash cifrado y la firma?

    
pregunta terrafrost 24.10.2012 - 05:54
fuente

3 respuestas

5

RSA las firmas funcionan así:

  • Para firmar , el firmante procesa los mensajes de entrada y luego coloca el valor de hash en una estructura ASN.1 (es decir, agrega un encabezado fijo al valor de hash). La secuencia resultante de bytes se rellena (los detalles de relleno se encuentran en el estándar RSA) para que la longitud total coincida con la del módulo RSA (un elemento de la clave pública). La estructura acolchada se interpreta entonces como un entero grande, con la convención big-endian, y se aplica la exponenciación modular de RSA, con el exponente privado. El resultado es la firma.

  • Para verificar , el verificador aplica la exponenciación modular de RSA con el exponente público , que deshace el último paso de la generación de firmas. Si esto produce una estructura ASN.1 debidamente rellenada, y el valor de hash contenido dentro de esa estructura coincide con el del mensaje de entrada, entonces el verificador se declara satisfecho con él.

Notaremos que RSA es un algoritmo de firma con recuperación : al verificar la firma, el verificador no solo obtiene un resultado booleano ("válido" o "no válido") sino que también recupera el hash. del mensaje de entrada en sí.

    
respondido por el Thomas Pornin 24.10.2012 - 13:29
fuente
3

Una firma RSA es literalmente eso: un hash de los datos, "cifrado" con una clave RSA. Digo "encriptado" porque en realidad no está encriptado, sino que se procesa de una manera que genera una firma. De cualquier manera, siempre deben coincidir.

    
respondido por el Polynomial 24.10.2012 - 10:50
fuente
1

Aquí está el algoritmo, eche un vistazo a esto, fuente .

Generación de par de claves RSA

ENTRADA: Parámetro de seguridad l. SALIDA: clave pública RSA (n, e) y clave privada d.

   1. Randomly select two primes p and q of the same bitlength l/2.
   2. Compute n = pq and φ = ( p − 1)(q − 1).
   3. Select an arbitrary integer e with 1 < e < φ and gcd(e, φ) = 1.
   4. Compute the integer d satisfying 1 < d < φ and ed ≡ 1 (mod φ).
   5. Return(n, e, d).

Generación de firma RSA básica

ENTRADA: clave pública RSA (n, e), clave privada RSA d, mensaje m. SALIDA: Firma s.

   1. Compute h = H (m) where H is a hash function.
   2. Compute s = h^d mod n.
   3. Return(s).

Verificación de firma RSA básica

ENTRADA: clave pública RSA (n, e), mensaje m, firma s. SALIDA: Aceptación o rechazo de la firma.

   1. Compute h = H (m).
   2. Compute h' = s^e mod n.
   3. If h = h' then return(“Accept the signature”);
       Else return(“Reject the signature”).

Cifrado RSA básico

ENTRADA: clave pública RSA (n, e), texto simple m ∈ [0, n - 1]. SALIDA: texto cifrado c.

   1. Compute c = m^e mod n.
   2. Return(c)

Lo que sucede es cuando se firma primero el hash y se firma usando una clave privada. Para verificar esta necesidad clave pública. Así que esto no es un cifrado (que necesita una clave pública). Si encriptas hash será como esta h ^ e mod n. Asi puede pasar esto  h ^ d mod n = h ^ e mod n? Esto puede suceder porque todo sucede en campos finitos, pero no podemos garantizarlo. Por favor considera que estoy hablando de esto en teoría.

    
respondido por el user827918 24.10.2012 - 18:56
fuente

Lea otras preguntas en las etiquetas