rsa hash crittografato == 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 è un oggetto codificato ASN.1 contenente un hash sha1 che corrisponde a test_ok.sha1.

Va tutto bene ma ...

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

Anche quello corrisponde.

La mia domanda è ... quante volte l'hash crittografato e la firma vanno a finire?

    
posta terrafrost 24.10.2012 - 05:54
fonte

3 risposte

5

RSA le firme funzionano in questo modo:

  • Al segno , il firmatario esegue l'hashing dei messaggi di input, quindi inserisce il valore hash in una struttura ASN.1 (ad esempio aggiunge un'intestazione fissa al valore hash). La sequenza risultante di byte è quindi riempita (i dettagli del riempimento sono nello standard RSA) in modo che la lunghezza totale corrisponda a quella del modulo RSA (un elemento della chiave pubblica). La struttura imbottita viene quindi interpretata come un grande numero intero, con la convenzione big-endian e viene applicata l'esponenziazione modulare di RSA, con l'esponente privato. Il risultato è la firma.

  • Per verificare , il verificatore applica l'esponenziazione modulare di RSA all'esponente pubblico , che annulla l'ultimo passaggio della generazione della firma. Se questo produce una struttura ASN.1 adeguatamente imbottita, e il valore di hash contenuto in quella struttura corrisponde a quello del messaggio di input, allora il verificatore si dichiara contenuto con esso.

Noteremo che RSA è un algoritmo di firma con ripristino : quando verifica la firma, il verificatore non ottiene solo un risultato booleano ("valido" o "non valido") ma recupera anche l'hash del messaggio di input stesso.

    
risposta data 24.10.2012 - 13:29
fonte
3

Una firma RSA è letteralmente quella - un hash dei dati, "crittografato" con una chiave RSA. Dico "crittografato" perché non viene realmente crittografato, ma elaborato in un modo che genera una firma. In ogni caso, dovrebbero sempre corrispondere.

    
risposta data 24.10.2012 - 10:50
fonte
1

Ecco l'algoritmo, dai un'occhiata a questo, fonte .

Generazione di coppie di chiavi RSA

INPUT: parametro di sicurezza l. OUTPUT: chiave pubblica RSA (n, e) e chiave privata 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).

Generazione di firma RSA di base

INPUT: chiave pubblica RSA (n, e), chiave privata RSA d, messaggio m. OUTPUT: Signature s.

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

Verifica della firma RSA di base

INPUT: chiave pubblica RSA (n, e), messaggio m, firma s. OUTPUT: accettazione o rifiuto della 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”).

Crittografia RSA di base

INPUT: chiave pubblica RSA (n, e), testo semplice m ∈ [0, n - 1]. OUTPUT: Ciphertext c.

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

Ciò che accade è quando si firma per la prima volta generare hash e firmarlo usando la chiave privata. per verificare questo bisogno di chiave pubblica. Quindi questa non è una crittografia (che necessita di una chiave pubblica). Se si cripta hash, sarà così h ^ e mod n. Quindi può succedere  h ^ d mod n = h ^ e mod n? Questo può accadere perché tutto accade in campi finiti, ma non possiamo garantirlo. Per favore considera che sto parlando di questo in teoria.

    
risposta data 24.10.2012 - 18:56
fonte

Leggi altre domande sui tag