Segretezza chiave vs segretezza algoritmo


8

è un'affermazione ben nota che

"La sicurezza crittografica deve fare affidamento su una chiave segreta anziché su un algoritmo segreto ."

Vorrei chiedere alcuni dettagli a riguardo. E quali sono le loro differenze?

Vedo la cosa ovvia che per un sistema multiutente, generare una chiave è estremamente più facile che generare un algoritmo distinto per ogni coppia di utenti (e anche per una singola coppia di utenti si potrebbe sostenere che l'aggiornamento della chiave è più semplice)

Ma è l'unico argomento?

Voglio dire, se definiamo

AlgorithmA = AlgorithmX + key A
AlgorithmB = AlgorithmX + key B

Quindi una modifica della chiave non è diversa da una modifica dell'algoritmo.

L'unica diversa che vedo è quella per una nuova coppia di utenti / chiavi

  • Gran parte della struttura dell'algoritmo rimane costante nel caso della chiave segreta,

  • La maggior parte della struttura dell'algoritmo deve cambiare nel caso dell'algoritmo segreto

Ma dov'è il limite? significato di "maggior parte"?

Vorrei avere più punti di vista e indizi per capire perché questa distinzione è di solito menzionata.


Risposte:


4

Definizione del problema

L'obiettivo della crittografia è approssimare un processo mediante il quale

crypt(x)

non trasmette informazioni su x ma esiste una funzione decrypttale che

decrypt(crypt(x)) == x

Se decrypt e crypt sono stati eseguiti solo nella stessa esecuzione dello stesso programma, è possibile implementarlo perfettamente utilizzando lo stato nascosto:

var map = {};  // A hidden hashmap.

function crypt(x) {
  var k = unique_unforgeable_value();
  map[k] = x;
  return k;
}

function decrypt(k) { return map[k]; }

In pratica però, crypte decryptsono chiamati da programmi diversi o diverse esecuzioni dello stesso programma, quindi dobbiamo approssimarci cryptusando una funzione deterministica il cui output è indistinguibile da bit casuali - deve essere incomprimibile (nel senso di Shannon) quindi non ci sono bit di struttura extra che possono essere usati per raccogliere informazioni su x.

Gli algoritmi sono altamente strutturati e quindi comprimibili. Quindi ciò di cui abbiamo bisogno è un modo per ottenere un'apparente casualità mantenendo il determinismo necessario per .decryptcrypt=identity

Risposta

Curry un semplice algoritmo comprimibile con un segreto incomprimibile

crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)

possiamo approssimare l'obiettivo sopra. crypte decrypthanno un alto contenuto informativo a causa dell'elevato contenuto informativo di secret anche se crypt_algoe decrypt_algohanno un basso contenuto informativo.

secretdeve essere tenuto lontano dagli attaccanti perché funzioni perché altrimenti un attaccante potrebbe semplicemente fare il curry sopra. L'algoritmo non deve essere tenuto segreto poiché fornisce solo una piccola parte del contenuto informativo della funzione curry.

Avvertimento

"La sicurezza crittografica deve basarsi su una chiave segreta anziché su un algoritmo segreto."

Non sono d'accordo con la parte anziché .

Potresti ottenere qualche misura di difesa in profondità mantenendo entrambi segreti, ma i test crypt_algosono difficili, quindi storicamente, gli algoritmi segreti sviluppati internamente dai dilettanti sono andati peggio quando sottoposti ad attacchi rispetto a quelli che sono stati attentamente esaminati da un gran numero di crittografi professionisti. Questo è il motivo per cui la sicurezza per oscurità ha ottenuto un nome meritatamente cattivo. L '"oscurità" si riferisce ai tentativi di mantenere segreto l'algoritmo in sostituzione della protezione adeguata delle chiavi.


Penso che questa sia la risposta corretta, l'algoritmo ha struttura e la chiave no, e questa è la chiave =)
Hernan_eche,

5

La distinzione che si desidera fare tra la chiave e l'algoritmo corretta non si basa sul fatto che gran parte dell'operazione sia contenuta nell'una o nell'altra, ma su dove risieda la complessità. Non sto parlando della complessità algoritmica qui, ma della complessità nel suo significato quotidiano: difficoltà a capire e ragionare.

L'algoritmo proprio è complesso e difficile da ragionare. In genere esegue un sacco di manipolazioni di bit apparentemente arbitrarie, operazioni logiche e aritmetiche e shuffle generale dei dati. È molto difficile per un laico o anche per un crittografo sapere quanta privacy tutte quelle manipolazioni ti acquistano effettivamente e a quale tipo di crittoanalisi potrebbe essere vulnerabile. Quindi il modo migliore per essere sicuri della sicurezza dell'algoritmo è di metterlo all'aperto e farlo esaminare da esperti il ​​più ampiamente possibile. RENDILO PUBBLICO.

La chiave, d'altra parte, è un concetto semplice: è un mucchio di bit che devono essere casuali. Non è necessario rivedere la chiave per garantire la correttezza della crittografia. Ogni chiave dovrebbe essere forte come qualsiasi altra chiave (e se questo non è vero, in linea di principio può essere scoperto dalla revisione dell'algoritmo, non dalla chiave). Sappiamo che la qualità della casualità disponibile per generare le chiavi è tutt'altro che perfetta, quindi in pratica alcune chiavi potrebbero essere deboli a causa della mancanza di casualità, ma almeno tutti possono sapere senza bisogno di essere un esperto crittografo e senza dover fare un'analisi difficile della chiave che una buona casualità porterà a una buona chiave. Quindi usa la migliore casualità che hai a disposizione, quindi non devi (DEVE non!) Condividere la chiave con tutti per avere fiducia nella tua crittografia.


Penso che questo meriti un commento. Ho letto la tua risposta e capisco il tuo punto, è giusto ad un certo punto, ma ho selezionato la risposta di @Mike Samuel che dice incredibilmente esattamente l'opposto !. È che l'algoritmo è meno complesso della chiave, perché l'algoritmo ha (e ha bisogno) di una struttura, ma la chiave (non ha bisogno di avere una struttura). Sono d'accordo. Invece hai detto: "La chiave, d'altra parte, è un concetto semplice: è un mucchio di bit che devono essere casuali", in realtà un semplice "concetto" non è un semplice "dato". La complessità di un dato "casuale" è la massima complessità possibile!
Hernan_eche,

@Hernan_eche La chiave ha un'elevata complessità di Kolmogorov rispetto ad altre stringhe di bit della stessa lunghezza. Ma, concettualmente, è solo una stringa casuale di bit e, come concetto, è molto più facile da capire rispetto a qualsiasi buon algoritmo crittografico.
David Richerby,

2

Ho fatto la stessa domanda qualche anno fa a uno dei noti esperti di crittografia.

Il punto più interessante qui è che puoi pensare alla chiave per contenere il codice dell'algoritmo e che l'algoritmo è una semplice Universal Turing Machine (UTM). Ricorda che vogliamo fare è avere un algoritmo fisso per l'attività crittografica che non cambia da una corsa dell'algoritmo a un'altra corsa, se consideri la chiave come parte dell'algoritmo, l'algoritmo deve cambiare ogni volta in assicurarsi che sia sicuro. Con un algoritmo fisso e una chiave scelta casualmente non abbiamo questo problema.

La differenza originale è più chiara se si pensa alla crittografia pre-moderna. Se l'avversario avesse saputo che l'algoritmo era andato perduto, sarebbe stato inutile, mantenere l'algoritmo era essenziale. Se in un caso particolare l'algoritmo fosse noto, tutto andrebbe perso per tutti gli usi futuri. Nella crittografia moderna, la chiave non fa parte dell'algoritmo , viene scelta in modo casuale , rivelando l'algoritmo crittografico (e persino le chiavi utilizzate in precedenza) non compromette la sicurezza dei suoi usi futuri poiché in futuro la chiave sarà solo un'altra stringa scelta casualmente e che garantirebbe la sicurezza, le chiavi utilizzate in precedenza non sono di aiuto per interrompere la nuova corsa.

Quindi cosa succede se consideriamo UTM più una chiave casuale? A meno che la chiave non abbia una buona struttura, non è possibile dimostrare che l'algoritmo sarà sicuro, ad esempio una chiave scelta a caso dalla distribuzione uniforme non funzionerà. La chiave dovrebbe essere "essenzialmente" un algoritmo fisso più una stringa casuale nel qual caso non è molto diverso dallo spostare la parte dell'algoritmo fisso della chiave in UTM, non sta cambiando da una corsa all'altra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.