it-swarm-eu.dev

Crittografia: dovrei usare RSA o AES?

Il mio modello è quello in cui ho diversi clienti che desiderano parlare con alcuni (ma non tutti) degli altri clienti.

Tutti i messaggi verranno inviati tramite un server.

Solo i due client che comunicano tra loro dovrebbero essere in grado di conoscere il messaggio. Quindi il server E gli altri client non dovrebbero essere in grado di capire quale messaggio è stato inviato.

La comunicazione tra due clienti può iniziare e terminare più volte al giorno.

I messaggi saranno in chiaro con lunghezza potenzialmente illimitata, ma probabilmente saranno molto inferiori, pensa SMS messaggi di stile.

Date queste circostanze, come devo crittografare i messaggi? Non mi dispiace scrivere codice extra se porta a una maggiore velocità o efficienza.

Conosco le nozioni di base su come funzionano RSA e AES, ma non riesco a capire cosa sia meglio.

Quando si genera una coppia di chiavi pubblica/privata per RSA, c'è qualche situazione in cui è necessario generare una nuova coppia? Oppure un cliente può avere una chiave pubblica e fornire la stessa chiave a chiunque voglia parlare con lui e solo lui è in grado di (mai) leggere i messaggi, ma memorizzano la chiave pubblica per tutti i messaggi futuri?

O dovrei avere una chiave AES simmetrica separata per coppia di client e condividerla semplicemente quando il contatto viene avviato per la prima volta e usarla per sempre. Ancora una volta, c'è qualche circostanza in cui questo dovrebbe essere generato di nuovo?

Come memorizzerei le chiavi in ​​modo che persistano in caso di arresto anomalo/arresto/riavvio del client?

39
Cheetah

Né, a meno che non sia entrambi. Stai ponendo la domanda sbagliata . In questa fase non dovresti pensare a un algoritmo crittografico, ma a un protocollo crittografico.

I protocolli crittografici sono difficili da progettare e sono una fonte frequente di bug di sicurezza. Non capisci completamente la crittografia a chiave pubblica, quindi non sei pronto per usarlo nel tuo protocollo crittografico.

Ad alto livello, il tuo modello è suscettibile di crittografia a chiave pubblica (ad esempio RSA). Consenti a ogni client di disporre della propria chiave privata e di pubblicare la sua chiave pubblica sull'altro client. La chiave privata di un client non cambia nel tempo, a meno che il client non sia stato compromesso. La crittografia simmetrica (ad es. AES) non si ridimensionerebbe bene perché ogni coppia di client avrebbe bisogno di una propria chiave segreta.

Usa il software esistente quando possibile. L'implementazione dei protocolli crittografici è difficile quasi quanto la loro progettazione. Per un modello in cui i clienti occasionalmente inviano messaggi tra loro, in stile e-mail, uno strumento che funzionerebbe bene è GnuPG . (Per comunicazioni bidirezionali, utilizzare SSL/TLS .)

Quindi: per le operazioni quotidiane, per inviare un messaggio, chiama gpg, crittografa con la chiave pubblica del destinatario e, mentre ci sei, firma con la chiave privata del mittente. Quando si riceve un messaggio, verificare la firma rispetto alla presunta chiave pubblica del mittente e decrittografare con la chiave privata del destinatario. In altre parole, invia con gpg --sign --encrypt -r NAME_OF_RECIPIENT e ricevi con gpg --verify seguito da gpg --decrypt.

Il problema rimanente è quello della distribuzione delle chiavi. Dopo che un client ha generato la sua coppia di chiavi, deve informarne gli altri client e distribuirla senza consentire l'intercettazione e la sostituzione della chiave pubblica in transito da parte di un utente malintenzionato. Come fare questo dipende molto dal tuo preciso scenario. Non trascurare la sicurezza di questa parte.

Se, e solo se, invocare GnuPG si rivela troppo lento, allora considera l'utilizzo di un'implementazione più leggera, forse fatta in casa, di un protocollo simile (passando dall'intervallo di posta elettronica a SMS range overhead.) Sotto il cofano, GnuPG genera una chiave simmetrica per ogni messaggio, poiché la crittografia a chiave pubblica è costosa per i messaggi di grandi dimensioni; l'algoritmo della chiave pubblica viene utilizzato solo per crittografare la chiave simmetrica e per firmare un digest del file. dovrebbe seguire questo modello: usare AES per la crittografia simmetrica, SHA-256 come algoritmo digest e RSA come algoritmo a chiave pubblica è una buona scelta.

Come già detto da In silico, RSA e AES hanno due scopi diversi. AES è un algoritmo veloce, adatto per crittografare un'intera conversazione. Ma ha un problema: come decidere quale chiave usare tra due parti senza che le altre lo sappiano?

RSA può essere la soluzione a questo. Se ogni partecipante ha la chiave pubblica RSA di ogni altro partecipante, chiunque può avviare una comunicazione crittografata con chiunque (utilizzando la chiave pubblica dell'altro partecipante) e decidere una chiave AES segreta da utilizzare. Dopo aver deciso la chiave AES, il resto della conversazione può essere crittografato utilizzando AES. Per dimostrare che al partecipante B che è veramente A che vuole parlargli, può essere usata una firma digitale.

Quello che ho descritto è, grosso modo, quello che fa l'handshake SSL quando un browser si connette a un server web abilitato SSL.

19
JB Nizet

Non prenderlo nel modo sbagliato ma ...

Conosco le nozioni di base su come funzionano RSA e AES, ma non riesco a capire cosa sia meglio.

Se conosci solo le basi, potresti non essere la persona giusta per risolvere questo problema (ancora). La sicurezza è una di quelle aree in cui devi essere molto particolare e attento, altrimenti invalidi l'intera configurazione della sicurezza.

Inoltre, non credo che abbiamo abbastanza informazioni per darti una risposta adeguata. I contratti commerciali relativi alle aspettative di sicurezza dovranno essere conosciuti in anticipo.

Nella maggior parte dei casi le chiavi non escono mai dalla macchina su cui sono generate per motivi di sicurezza, quindi se si intende "condividere" le informazioni, una soluzione di chiave pubblica è di solito la scelta giusta da un punto di vista della sicurezza. L'eccezione a ciò è se puoi condividere una chiave simmetrica in modo sicuro come inviare la chiave alla persona su un supporto fisico.

6
Andrew White

Fondamentalmente, l'uso della crittografia a chiave pubblica (come RSA) è molto più costoso dell'uso della crittografia a chiave simmetrica (come AES) e quando ci sono molti messaggi che passano da uno all'altro, è meglio usare un simmetrico chiave.

Ora, la creazione e lo scambio della chiave simmetrica può essere eseguita utilizzando la crittografia della chiave pubblica.

Per esempio:

Ogni client ha una coppia di chiavi privata-pubblica e la chiave pubblica è archiviata sul server. Quando due client iniziano la sessione di comunicazione, ognuno prende la chiave pubblica dell'altro dal server e invia un numero crittografato all'altro. Quindi ogni lato esegue l'hashing di questi due numeri e utilizza il risultato come chiave per crittografare/decrittografare i dati da ora in poi.

3
MByD

Se usi lo stile PUBBLICO/PRIVATO (RSA con bit sufficienti :)) puoi impostare il tipo di comunicazione sicura che descrivi in ​​questo modo:

  1. Alice scrive un messaggio
  2. Alice lo crittografa usando la chiave Alice PRIVATE
  3. Alice lo crittografa nuovamente usando la chiave Bob PUBLIC
  4. Alice invia i risultati a Bob.

Poi:

  1. Bob riceve un messaggio (presumibilmente) da Alice
  2. Bob lo decodifica usando la chiave Bob PRIVATE
  3. Bob lo decodifica di nuovo usando la chiave Alice PUBLIC
  4. Se tutto va bene, Bob legge il messaggio.

Nota:

  • Bob è l'unico in grado di leggere questo messaggio.
  • Bob sa senza dubbio che proviene da Alice.

Ottenere entrambi questi attributi con AES è un po 'più complicato.

2
Jesse Chisholm