Informazioni sulla chiave dell'algoritmo AES e sul testo cifrato

1

Ho le due seguenti domande sull'algoritmo AES:

A - La chiave deve seguire un modello specifico oltre alla lunghezza o può essere una stringa completamente casuale? Quindi, se seleziono 16 caratteri ASCII casuali, potrei usarli direttamente come una chiave a 128 bit? Se la risposta è NO, ci sono algoritmi di crittografia in cui questo potrebbe essere fatto? Se la risposta è SI, riceverò un risultato valido nella domanda B?

B - Se uso una chiave casuale per decodificare un testo cifrato specifico, riceverò un output valido (diverso dal testo in chiaro originale ovviamente)?

    
posta Lucas 24.01.2016 - 01:58
fonte

4 risposte

2

A) Le chiavi AES sono costituite da bit binari, non stringhe di caratteri. Dovrebbero infatti essere casuali e non sono richieste altre proprietà. Tuttavia, ciò implica che dovrebbero essere bit casuali e non caratteri ASCII.

B) Se decifri il ciphertext con una chiave casuale arbitraria, otterrai alcuni byte come testo in chiaro. Se questi byte costituiscono un testo in chiaro valido dipende dalla tua specifica definizione di valido, ma per la maggior parte delle definizioni di valido, la risposta è no. Se, tuttavia, stai davvero chiedendo se farà fallire la decrittografia, allora anche quella risposta è no.

    
risposta data 24.01.2016 - 04:00
fonte
1

A: qualsiasi chiave di crittografia per qualsiasi algoritmo simmetrico può e dovrebbe essere una sequenza casuale di bit. L'applicazione di qualsiasi tipo di modello ridurrebbe il keyspace e quindi ridurre la sicurezza.

Una stringa di 16 caratteri ASCII casuali avrebbe funziona come una chiave, ma è così non sarebbe molto buono Una stringa di bit casuale di quella lunghezza ha 128 bit di entropia . Ci sono 95 caratteri ASCII stampabili, dando 6,57 bit di entropia per carattere e un totale di 105,12 bit di entropia per la stringa. Questo è abbastanza sicuro, ma non è buono come potrebbe essere.

Di solito ciò che viene fatto in pratica è usare un lungo memorabile passphrase e per eseguirlo attraverso una funzione S2K (stringa a chiave), uno che è progettato per essere intrinsecamente lento. La passphrase è hash, quindi il risultato viene nuovamente sottoposto a hash e questo viene ripetuto migliaia o milioni di volte. Salt è anche comunemente usato per creare la stessa passphrase risultato in chiavi diverse. Entrambe queste misure rendono la vita difficile un aggressore che cerca di trovare la passphrase tramite la ricerca di forza bruta; il l'hashing lento rallenta le prove e il sale ne impedisce l'uso tavole arcobaleno .

La sezione 3.7 di RFC 4880 presenta tre schemi S2K usati nel Protocollo OpenPGP. Quello buono usa salt e una iterazione specificata dall'utente conta che può variare da 1.024 a oltre 65 milioni.

B: Beh, sì, se con "valido" intendi "la funzione ha un risultato". Otterrai una stringa di bit dall'aspetto casuale della stessa lunghezza del messaggio originale. Si noti che OpenPGP, ad esempio, utilizza un valore a 16 bit rilevare immediatamente una chiave errata, prima di perdere un sacco di tempo per "decifrare" erroneamente un messaggio lungo. Ma se non controlli, allora sì, sputerà qualcosa.

    
risposta data 24.01.2016 - 12:05
fonte
1

Una chiave a 128 bit per AES deve essere lunga solo 128 bit. Nessun'altra proprietà è richiesta , anche se altre proprietà potrebbero essere desiderate .

Se scegli una stringa di 16 caratteri, non utilizzerai davvero quei 128 bit al massimo. ASCII supporta solo 7 bit per carattere (il primo bit di ciascun byte è sempre zero) e l'entropia del mondo reale supera di circa 6 bit per carattere di testo ASCII. Quindi una password di 16 caratteri se utilizzata direttamente per AES a 128 bit ha lo stesso livello di sicurezza di una chiave a 96 bit, piuttosto che di una chiave a 128 bit.

Per una chiave di crittografia, si desidera utilizzare quei bit preziosi al loro meglio; vuoi che ogni bit sia ugualmente inconcepibile.

Il modo migliore per farlo è usare un hash. La cosa bella dell'utilizzo di un hash è che la tua password non deve essere esattamente 16 caratteri; può essere più breve o più lungo, e nella tua chiave risultante avrai ancora una distribuzione casuale dei bit.

MD5 produrrà un output a 128 bit, quindi è conveniente. Ma in realtà MD5 è piuttosto rotto e il tuo output hash non ha bisogno di esattamente della stessa dimensione della tua chiave, deve solo essere almeno altrettanto grande come chiave. Potresti anche usare SHA-256 e poi prendere i primi 128 bit di output hash per la tua chiave. O gli ultimi 128 bit. O il medio 128 bit. Finché sei coerente, non importa.

Che, a patto che non importi, che ne dici di eseguire l'hash più volte. In questo modo un utente malintenzionato dovrà eseguire l'hash più volte per ogni ipotesi se vuole indovinare la nostra password.

In realtà, qualcuno ci ha già pensato, e c'è una lista di "Funzioni di derivazione chiave" progettate specificamente per prendere un input arbitrario di qualsiasi tipo e dimensione e produrre una chiave di almeno X bit di lunghezza, spesso con la proprietà aggiunta che derivare la chiave dalla password richiede molto tempo (e forse un sacco di memoria).

Questi sono stati discussi abbastanza estesamente qui, quindi cerca semplicemente PBKDF2 o scrypt per maggiori dettagli.

Quindi, per riassumere, la risposta è sì funziona , ma no non dovresti farlo perché ci sono opzioni migliori pronte che rendono il tuo tasti migliori in ogni modo .

    
risposta data 24.01.2016 - 06:08
fonte
0

Per quanto ne so non è la stringa che funziona come un pattern o chiave, ma una matrice di byte per esempio. La lunghezza della chiave è molto importante. Non si utilizza una chiave di stringa casuale come parola chiave, ma è possibile generare una matrice di byte a 128 bit da una parola chiave stringa. Gli algoritmi di hash lo fanno per te. Ad esempio, è possibile utilizzare l'algoritmo hash SHA per hash una parola chiave, quindi utilizzare 128 bit come chiave.

Vedi i miei codici come esempio qui . Si tratta di argomenti non correlati, ma penso che abbia tutto ciò che serve e che sia codificato con Java.

Riguardo la tua seconda domanda, temo che non otterrai un risultato valido. Se decrittografate correttamente i dati con una chiave errata, riceverete solo byte privi di significato come testo normale.

    
risposta data 24.01.2016 - 10:54
fonte

Leggi altre domande sui tag