C'è più di una ragione:
1) In realtà l'algoritmo RSA è più lento. Ad esempio :
By comparison, DES (see Section 3.2) and other block ciphers are much faster than the RSA algorithm. DES is generally at least 100 times as fast in software and between 1,000 and 10,000 times as fast in hardware, depending on the implementation. Implementations of the RSA algorithm will probably narrow the gap a bit in coming years, due to high demand, but block ciphers will get faster as well.
Quindi se guardi qui puoi vedere che elencano DES come prendendo 54.7 cicli per byte e prendendo SHA-1 11,4 cicli per byte.
Quindi calcolare l'hash SHA-1 del documento e firmare è un'ottimizzazione delle prestazioni e criptare l'intero documento con la chiave privata.
2) Suddividendo il documento dalla firma si ha un sistema più flessibile. Puoi trasmetterli separatamente o conservarli in posti diversi. Potrebbe essere un caso in cui tutti hanno già una copia del documento e vuoi semplicemente che la persona A verifichi alla persona B di avere lo stesso documento (o un hash di esso).
3) Pensandoci, se qualcuno crittografa il documento con una chiave privata falsa e lo decifri con la vera chiave pubblica, il tuo algoritmo non può effettivamente dirti il risultato (firmato o meno). A meno che il tuo programma non possa interpretare il significato del documento risultante (forse sai che dovrebbe essere XML, ecc.), Allora non puoi dire in modo affidabile che era "firmato". Hai ricevuto il messaggio giusto o il messaggio sbagliato. Presumibilmente un umano potrebbe dire, ma non una macchina. Usando il metodo hash, presumo che abbia già il testo in chiaro e voglio solo verificare che la persona A abbia firmato.
Dire che ho un programma che lancia armi nucleari. Ottiene un file di comando che è crittografato usando il tuo metodo, quindi decrittalo con la chiave pubblica e inviamo il risultato al mio processore di comandi. Si sta quindi facendo affidamento sul processore dei comandi per sapere se si tratta di un comando valido. È spaventoso. Cosa succede se il protocollo del comando è solo la latitudine e la longitudine di dove indirizzare il missile, codificato in binario? Potresti facilmente lanciarti sul bersaglio sbagliato.
Usando un hash, ottieni un comando e un hash firmato su un canale di testo normale. Hai cancellato il comando, controlla la firma e, se non corrispondono, non ti preoccuperai di inviare nulla al processore dei comandi. Se corrispondono, invii i comandi.
Se vuoi nascondere il contenuto del comando, prendi i comandi e la firma, comprimi assieme e crittografa il tutto con la chiave pubblica della stazione ricevente prima di inviarli.