Crittografia: dovrei usare RSA o AES?

34

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

Tutti i messaggi verranno inviati attraverso 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 client può iniziare e terminare più volte al giorno.

I messaggi saranno in testo con lunghezza potenzialmente illimitata, ma probabilmente saranno molto meno, pensate ai messaggi in stile SMS.

Date queste circostanze, come dovrei crittografare i messaggi? Non mi interessa scrivere codice aggiuntivo se porta a una maggiore velocità o efficienza.

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

Quando generi una coppia di chiavi pubblica / privata per RSA, c'è qualche situazione in cui dovresti generare una nuova coppia? Oppure un client può avere una chiave pubblica e dare la stessa chiave a chiunque voglia parlare con lui e solo a lui essere 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 una coppia di client e condividerla semplicemente quando il contatto viene avviato per la prima volta e usato per sempre. Ancora, c'è qualche circostanza in cui questo dovrebbe essere generato di nuovo?

Come conserverei la (e) chiave (e) in modo che persistano se il client si blocca / spegne / si riavvia?

    
posta Cheetah 18.12.2011 - 00:48
fonte

5 risposte

42

Né, a meno che non sia entrambi. stai facendo la domanda sbagliata . Non dovresti pensare a un algoritmo crittografico in questa fase, ma a un protocollo crittografico.

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

Ad un livello elevato, il tuo modello è suscettibile di crittografia a chiave pubblica (ad esempio RSA). Lascia che ogni client abbia la sua chiave privata e pubblichi la sua chiave pubblica sull'altro client. La chiave privata di un cliente non cambia nel tempo, a meno che il client non sia stato compromesso. La crittografia simmetrica (ad esempio AES) non si adatta bene qui perché ogni coppia di client dovrebbe avere la propria chiave segreta.

Utilizza il software esistente quando possibile. L'implementazione di protocolli crittografici è quasi difficile come progettarli. Per un modello in cui i clienti di tanto in tanto inviano messaggi a vicenda, in stile e-mail, uno strumento che funzionerebbe bene è GnuPG . (Per comunicazioni bidirezionali, utilizza SSL / TLS .)

Quindi: per le operazioni quotidiane, per inviare un messaggio, chiamare gpg , crittografare con la chiave pubblica del destinatario e mentre ci si trova a firmare con la chiave privata del mittente. Quando si riceve un messaggio, controllare la firma con la chiave pubblica del presunto mittente e decrittografarlo 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 informare gli altri client su di esso e distribuirlo senza consentire che la chiave pubblica venga intercettata e sostituita in transito da un utente malintenzionato. Come fare questo dipende molto dal tuo preciso scenario. Non trascurare la sicurezza di questa parte.

Se, e solo se, invocando GnuPG risulta essere troppo lento, allora considera di usare un'implementazione più leggera, forse fatta in casa, di un protocollo simile (passando dall'overhead del range di posta elettronica al sovraccarico degli SMS). Sotto la cappa, GnuPG genera una chiave simmetrica per ogni messaggio, perché la crittografia a chiave pubblica è costosa per i messaggi di grandi dimensioni; l'algoritmo a chiave pubblica viene utilizzato solo per crittografare la chiave simmetrica e per firmare un digest del file. Dovresti seguire questo modello. Utilizzando AES per la crittografia simmetrica, SHA-256 come algoritmo di digest e RSA come algoritmo a chiave pubblica è una buona scelta.

    
risposta data 23.01.2012 - 18:43
fonte
17

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 gli altri lo sappiano?

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

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

    
risposta data 18.12.2011 - 00:59
fonte
6

Non prenderla nel modo sbagliato ma ...

I know the rough basics of how RSA and AES work but I can't figure out what is best.

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

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

Nella maggior parte dei casi le chiavi non abbandonano mai la macchina sulla quale sono generate per motivi di sicurezza, quindi se si intende "condividere" le informazioni, una soluzione a chiave pubblica di solito è la scelta giusta da un punto di vista puramente di sicurezza. L'eccezione è se è possibile condividere una chiave simmetrica in modo sicuro, ad esempio l'invio della chiave alla persona su un supporto fisico.

    
risposta data 18.12.2011 - 00:56
fonte
3

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 usa una chiave simmetrica.

Ora, la creazione e lo scambio della chiave simmetrica possono essere eseguiti utilizzando la crittografia a chiave pubblica.

Ad esempio:

Ogni client ha una coppia di chiavi pubblica-privata e la chiave pubblica è memorizzata sul server. Quando due client avviano una sessione di comunicazione, ciascuno 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 / decodificare i dati da ora in poi.

    
risposta data 18.12.2011 - 00:56
fonte
2

Se usi lo stile PUBLIC / PRIVATE (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 utilizzando il tasto di Alice
  3. Alice lo cripta di nuovo usando la chiave PUBLIC
  4. di Bob
  5. Alice invia i risultati a Mario.

Quindi:

  1. Bob riceve un messaggio (presumibilmente) da Alice
  2. Bob lo decifra utilizzando il tasto di PRIVATE
  3. di
  4. Bob lo decrittografa nuovamente utilizzando la Alice PUBLIC chiave
  5. 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 questi attributi con AES è un po 'più complicato.

    
risposta data 21.08.2015 - 00:22
fonte

Leggi altre domande sui tag