DSA Genera diverse firme con gli stessi dati [chiuso]

2

Sto usando l'esempio fornito in msdn articolo sulla classe DSACryptoServiceProvider. Il problema è che ottengo una firma diversa ogni volta che eseguo il codice. Ho provato OpenSSL e non ho avuto questo problema, ma ho bisogno di lavorare con System.Security.Cryptography questa volta.

Questo è un codice sorgente: questo è il valore hash da firmare

byte[] HashValue =
        {
            59, 4, 248, 102, 77, 97, 142, 201,
            210, 12, 224, 93, 25, 41, 100, 197,
            213, 134, 130, 135
        };

ed è qui che si trova il problema

 // The value to hold the signed value.
        byte[] SignedHashValue1 = DSASignHash(HashValue, privateKeyInfo, "SHA1");
        byte[] SignedHashValue2 = DSASignHash(HashValue, privateKeyInfo, "SHA1");

Ho usato il debugger per capire che SignedHashValue1 non è uguale a SignedHashValue2

    
posta Ibrahim.I 13.12.2013 - 17:05
fonte

1 risposta

9

Le implementazioni tradizionali di DSA scelgono un nonce casuale per ogni operazione di firma. Ciò porta a una firma diversa, anche quando si firmano gli stessi dati. Il problema non è che la firma sia diversa ogni volta, è una tua errata aspettativa che dovrebbe essere la stessa.

Controlla Wikipedia su DSA per i dettagli:

Signing

  • Generate a random per-message k
  • Calculate r from k
  • Calculate s from r and the private key
  • The signature is (r,s)

Poiché k differisce per ogni messaggio, anche la firma è diversa. Questo k casuale è essenziale per la sicurezza di DSA.

Una bella alternativa a un $ k $ casuale deriva dalla chiave privata e dall'hash del messaggio tramite hashing. Questo comportamento si comporta come un valore casuale dal punto di vista di un utente malintenzionato, ma impedisce un errore catastrofico durante la generazione di una firma utilizzando un PRNG debole. Questo approccio si tradurrà nella stessa firma quando si firmano gli stessi dati. RFC6979 - Utilizzo deterministico dell'algoritmo della firma digitale (DSA) e            Algoritmo di firma digitale a curva ellittica (ECDSA) specifica un modo per farlo.

Non dovresti provare a verificare una firma DSA firmando nuovamente e confrontando. È necessario utilizzare l'operazione di verifica specializzata utilizzando la chiave pubblica. Le firme sono utili perché non hai bisogno della chiave privata per verificare una firma.

Se puoi utilizzare la stessa chiave per la firma e la verifica, dovresti prendere in considerazione l'utilizzo di un MAC invece di una firma. HMAC-SHA-2 è quello che raccomando.

    
risposta data 13.12.2013 - 17:36
fonte

Leggi altre domande sui tag