Perché la dimensione dei messaggi crittografati con GPG non è proporzionale al numero di destinatari e alle dimensioni del file?

3

Ho notato che quando utilizzo GnuPG per crittografare un file per più destinatari, la dimensione del messaggio crittografato non sembra essere direttamente proporzionale al numero di destinatari.

Ad esempio, un file che ho testato è 836 byte in testo semplice.

  • crittografato per 1 destinatario, è 1090 byte
  • crittografato per 2 destinatari, è 1619 byte (810 byte per destinatario)
  • crittografato per 9 destinatari, è 4738 byte (526 byte per destinatario)
  • crittografato per 51 destinatari, 26.397 byte (517 byte per destinatario)

Poiché i dati crittografati dovrebbero apparire casuali, penso che la differenza non sia dovuta alla compressione. Non tutti i 51 tasti hanno la stessa dimensione / algoritmo chiave, ma non vedo come questo possa spiegare una dimensione del file così drammatica.

Come posso cifrare un file di 836 byte per 51 persone, in modo che possano tutti decodificare il mio file fino alla sua dimensione originale senza aggiungere almeno 836 byte per destinatario?

    
posta rose 05.12.2014 - 23:10
fonte

2 risposte

6

Perché l'intero messaggio non è crittografato separatamente per ciascun destinatario.

Invece, una singola chiave di crittografia simmetrica viene scelta a caso, il messaggio viene crittografato una volta utilizzando quella chiave, e quindi la chiave di crittografia viene crittografata separatamente per ciascun destinatario, utilizzando la chiave pubblica di quel destinatario e aggiunta al messaggio crittografato.

Ogni destinatario decrittografa il messaggio utilizzando prima la propria chiave privata per decodificare la crittografia simmetrica e quindi decrittografa il messaggio utilizzando quella chiave.

Poiché le chiavi sono in genere molto più corte del testo in chiaro, questo consente di risparmiare molto spazio. (Permette anche ai destinatari di sapere che tutti hanno decrittografato lo stesso messaggio. Se i messaggi sono stati crittografati separatamente per il destinatario, un mittente subdolo potrebbe inviare messaggi diversi a ciascun destinatario, facendo finta di essere tutte copie carbone dello stesso messaggio.)

Con i tuoi dati, l'aggiunta del secondo destinatario ha aggiunto 527 byte. Quel secondo destinatario probabilmente aveva una chiave da 512 byte, più 15 byte per identificare il destinatario. I destinatari successivi avranno avuto diverse chiavi di lunghezza e diversi dati identificativi, quindi l'importo aggiunto per ciascuna sarà variabile.

    
risposta data 05.12.2014 - 23:33
fonte
1

Sistemi di crittografia ibridi

OpenPGP definisce un sistema di crittografia ibrido , che combina il meglio della crittografia asimmetrica (chiave pubblica) e della crittografia simmetrica. Mentre la crittografia asimmetrica è ottima per la gestione delle chiavi, è molto lenta per la crittografia di grandi quantità di dati; la crittografia simmetrica d'altra parte richiederebbe lo scambio di chiavi con tutti quelli con cui si desidera comunicare individualmente, ma ha prestazioni eccezionali.

I sistemi di crittografia ibrida utilizzano la crittografia asimmetrica per crittografare una chiave casuale per la crittografia simmetrica, mentre il messaggio effettivo è simmetricamente crittografato. In OpenPGP, questa chiave è chiamata chiave di sessione .

Destinatari multipli

Questo ha un altro vantaggio: se devono essere indirizzati più destinatari, non è necessario crittografare il messaggio più volte. Invece, tutto ciò che deve essere fatto è la crittografia della chiave di sessione per tutti. Puoi osservare ciò osservando i pacchetti contenuti in un file dopo averli crittografati a più persone (qui, pgpdump offre l'output migliore rispetto a gpg --list-packets ):

echo 'foo' | gpg --recipient a4ff2279 --recipient d745722b --encrypt | LANG=C pgpdump
Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
    New version(3)
    Key ID - 0xCC73B287A4388025
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(4093 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
    New version(3)
    Key ID - 0xDAA855623A5E68F7
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(2046 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
    Ver 1
    Encrypted data [sym alg is specified in pub-key encrypted session key]
        (plain text + MDC SHA1(20 bytes))

Il pacchetto chiave di sessione crittografato a chiave pubblica è contenuto twize, una volta per ogni chiave di crittografia (sotto). Le diverse dimensioni possono essere spiegate dalle diverse dimensioni dei tasti (RSA 2048k vs RSA 4096k per le sottochiavi). I dati sono nascosti in Pacchetto crittografato simmetricamente e MDC .

    
risposta data 06.12.2014 - 01:33
fonte

Leggi altre domande sui tag