Protezione dell'algoritmo di crittografia se l'utente malintenzionato conosce la chiave

6

Oggi il nostro professore di programmazione ci ha sfidato a creare un programma di crittografia testuale: gli consegneremo un programma che codifica solo (non il codice sorgente), oltre a un testo cifrato generato da esso. Vinciamo se non può decodificare il testo cifrato dato. Se il programma utilizza una chiave o qualche altro parametro necessario per la decodifica del testo cifrato, dobbiamo fornirglielo.

Mi chiedo quali opzioni debba decifrare il mio ciphertext.

Prima di tutto, immagino che potrebbe decompilare il programma e scoprire il processo. Così ho deciso di farlo con PHP nel mio webserver.

La seconda cosa è, ovviamente, non dovrei usare metodi di crittografia conosciuti / popolari. Tutto quello che dovrebbe fare è provare ogni metodo (usando la chiave fornita).

Quindi si riduce a fare qualcosa di originale credo ... o no. Niente mi impedisce di utilizzare diversi algoritmi di crittografia popolari. Forse posso persino mutare la chiave ogni volta che applico uno degli algoritmi.

Ho visto questa domanda: La crittografia multipla è una buona idea? - e sembra che usare algoritmi di crittografia diversi non sia utile - ma nel mio caso mi sembra una buona idea: come potrebbe conoscere ho usato AES e poi BlowFish quindi qualcos'altro ecc. anche se ha la chiave necessaria? La mia idea è fattibile per questa sfida?

    
posta Omega 14.07.2015 - 21:18
fonte

2 risposte

5

Viene richiesto di fornire un programma che esegue la crittografia ma non la decrittografia. Ciò significa che la soluzione più ovvia è utilizzare la crittografia asimmetrica. Qualsiasi algoritmo di crittografia asimmetrico standard farà.

Dici:

If the program uses a key or some other parameter necessary for the decryption of the ciphertext, we must provide it to him.

Ma hai solo affermato che dovevi consegnare un programma per la crittografia, non la decrittografia. Ovviamente con la crittografia asimmetrica il programma che si consegna per la crittografia non utilizzerà la chiave di decodifica.

Se dovessi consegnare sia il codice di decrittazione che la chiave di decodifica, non ci sarebbe nulla che potresti fare per proteggere il tuo cihpertext. Se devi consegnare solo la chiave e non il codice, questo si apre con una grossa scappatoia, potresti trarne vantaggio.

Molti algoritmi crittografici includono costanti dall'aspetto casuale. Se sei libero di progettare il tuo algoritmo, il limite tra le costanti nell'algoritmo e la chiave può essere manipolato come desideri. Prendi qualsiasi algoritmo standard chiama le costanti nell'algoritmo della chiave e passa a quelle sopra e chiama la chiave delle costanti dell'algoritmo originale (che saranno quindi codificate nel programma di decrittazione, che non devi consegnare).

Questo sarebbe sicuramente un modo per piegare le regole a tuo vantaggio, ma rimarrebbe nella parola delle regole come indicato nella tua domanda. Naturalmente non posso escludere che tu abbia accidentalmente formulato i vincoli in modo diverso da come era previsto, nel qual caso questa soluzione potrebbe non essere applicabile.

Chiedi anche:

So it boils down to making something original I guess

Sarei sorpreso se fosse questa l'intenzione. Sicuramente trovare un algoritmo originale non è considerato il modo in cui viene raggiunta la sicurezza.

Forse il professore voleva fare un punto sulla sicurezza degli algoritmi originali mostrando come tutti gli algoritmi originali sarebbero stati interrotti. Tuttavia, se questa è l'intenzione della sfida, il professore sta correndo il rischio che una delle soluzioni abbia vulnerabilità troppo sottili perché il professore possa immediatamente sfruttare.

    
risposta data 14.07.2015 - 21:57
fonte
3

Quindi il tuo professore ti sta costringendo a utilizzare Sicurezza attraverso l'oscurità . Interessante. Nel mondo reale si progetta un sistema di sicurezza intorno al principio di Kerckhoffs che si dovrebbe assumere che un utente malintenzionato sappia tutto sul sistema tranne i tasti. Questo incarico è l'esatto contrario, interessante.

In primo luogo, un punto nettissimo ma importante: la frase "Vinceremo se non può decifrare il testo cifrato dato". dovrebbe scatenare campane d'allarme perché l'idea che è possibile creare un sistema che sia "indistruttibile" è uno dei più grandi malintesi sulla sicurezza delle informazioni: non è possibile.

Dato abbastanza tempo e sforzi, un abile aggressore può rompere il sistema crittografico qualsiasi , non importa quanto sia ben fatto. Questo è il motivo per cui amo la frase "hardening a system" perché implica che stai rendendo più difficile per l'attacker, ma ammette che è ancora possibile interrompere.

Per quanto riguarda il tuo incarico, immagino che la domanda principale sia capire che cosa il professore stia cercando. Immagino che stia cercando di vedere che hai pensato a una serie di possibili attacchi e che puoi mettere insieme i blocchi di costruzione cripto in un modo ragionevole. (Può anche sperare che uno studente lo sorprenda con un nuovo sistema intelligente a cui non avrebbe mai pensato prima.)

La tua idea di fare tutto sul lato server in modo che non abbia alcun eseguibile da decompilare è una grande idea.

Alcune altre cose a cui pensare (in cima alla mia testa):

  1. Non inventare il tuo, è un uso migliore del tuo tempo per combinare insieme elementi costitutivi comuni in modo intelligente.

  2. Sembra che si aspetti che tu concateni più algoritmi di crittografia. Come indicato nella domanda collegata, non viene utilizzato molto in pratica perché viola il principio di Kerckhoffs, ma ha perfettamente senso per il tuo compito, quindi inizia da quello.

  3. Devi dargli tutto il materiale per le chiavi / inizializzazione, quindi probabilmente cercherà di fare delle ipotesi basate sulla dimensione dei tasti ("ah, sembra una chiave RSA a 1024 bit, proviamo RSA ... "). Ma nulla dice che le chiavi reali devono essere le stesse che ha il prof, solo che devi essere in grado di derivare le vere chiavi dal materiale di trasparenza che gli dai. Guarderei le Funzioni di derivazione chiave e Funzioni di allungamento dei tasti come modi per rotolare attorno al materiale chiave prima di usarlo effettivamente (concatenare / troncare gli hash è anche un buon trucco).

  4. Se ti è permesso usare la tua idea completamente lato server, pensa a rate limitando la frequenza con cui può inviare un testo in chiaro per essere crittografato (cioè solo 1 tentativo per 5 secondi).

  5. Anche se devi dargli un binario, usa una funzione hash molto lenta / una funzione di allungamento dei tasti in modo da perdere un sacco di tempo in attesa che venga eseguita.

Come ha detto @Schroeder, questo è un problema divertente e mi piacerebbe continuare a pensarci, ma probabilmente dovrei tornare al lavoro ...

    
risposta data 14.07.2015 - 22:10
fonte

Leggi altre domande sui tag