Uso di RC4 nell'applicazione in tempo reale

3

Ho bisogno di usare un codice di flusso nella mia applicazione. So che usare la stessa chiave per molti messaggi non è una buona pratica per i cipri stream (RC4). Ma non voglio neanche creare una nuova chiave tutto il tempo, così ho pensato a quanto segue.
Creo in modo sicuro una chiave segreta. Quindi per ogni messaggio che invio, la chiave che uso nella crittografia sarà l'hash sha1 della chiave precedente.
Quindi per il primo messaggio la chiave sarà key = sha1(key)
per il 2 ° messaggio la chiave sarà key = sha1(sha1(key)) , ecc.

key := makeSecureKey()
while(true){
     key := sha1hash(key);
     message := getNewMessage();
     encrypted_message := RC4.Encrypt(message, key);
     send(encrypted_message);
}

La crittografia è utilizzata correttamente qui?
Infine se invece di usare il risultato a 160 bit dell'algoritmo sha1, io uso solo i primi 128 dei 160 bit come chiave c'è un problema?

    
posta jfgdfhggjfhgjv 26.11.2015 - 21:05
fonte

1 risposta

1

Questa è una cattiva pratica per tanti motivi.

  1. RC4 è stato interrotto in ogni modo da domenica.
  2. Il tuo algoritmo di generazione della chiave è di casa e potrebbe non essere sicuro. Forse qualcuno su crypto.stackexchange.com è disposto ad analizzarlo per te. Lo lascerei indietro e utilizzerei una KDF pubblicata.
  3. Sono noti attacchi contro RC4 che implicano derivazioni successive di una chiave iniziale. Non so se ce n'è uno per questo.
  4. La funzione di hashing SHA non è stata progettata per essere un buon PRNG, né un buon generatore di chiavi, questi non sono il suo scopo. Potrebbero esserci degli artefatti all'interno dell'hash risultante che compromettono il modo in cui un qualsiasi codice lo utilizza come chiave, per non parlare di RC4.
  5. Le moderne crittografie a blocchi con modalità CBC sono più veloci di quanto il tuo stream di rete possa gestire i dati, quindi se stai viaggiando su un filo, non hai bisogno di un codice di streaming.

Questo Q & A ha una risposta eccellente per il motivo per cui dovrebbe usare i codici a blocchi sopra i codici di flusso. Inoltre, preferisco AES + CBC per la privacy (crittografia) e HMAC per la protezione di integrità su algoritmi come EAX o GCM che eseguono entrambi in un unico passaggio. Non sono sicuro di poter difendere questa posizione (sicurezza, matematicamente), tuttavia l'unico algoritmo per risolvere entrambi mi disturba.

    
risposta data 26.11.2015 - 22:07
fonte

Leggi altre domande sui tag