Algoritmi di crittografia spiegati con esempi

La crittografia, nella sua forma più elementare, è la scienza dell'uso di codici e cifre per proteggere i messaggi.

La crittografia sta codificando i messaggi con l'intento di consentire solo al destinatario previsto di comprendere il significato del messaggio. È una funzione a due vie (devi essere in grado di annullare qualsiasi rimescolamento che hai fatto al messaggio). Questo è progettato per proteggere i dati in transito.

Algoritmi di crittografia spiegati con esempi


Se stai cercando uno sfondo generale sulla differenza tra algoritmi simmetrici e asimmetrici e una panoramica generale di cosa sia la crittografia, inizia qui . Questo articolo tratterà principalmente due degli algoritmi di crittografia più comunemente usati.

Come panoramica generale, c'era un grosso problema con gli algoritmi simmetrici quando sono stati creati per la prima volta: funzionavano efficacemente solo se entrambe le parti già conoscevano il segreto condiviso. In caso contrario, scambiare in modo sicuro una chiave senza una perdita di dati da parte di terzi è stato estremamente difficile.

E se una terza parte ha ottenuto la chiave, è stato molto facile per loro interrompere la crittografia, vanificando lo scopo della comunicazione sicura.

Diffie-Hellman ha risolto questo problema consentendo agli sconosciuti di scambiare informazioni su canali pubblici che possono essere utilizzati per formare una chiave condivisa. Una chiave condivisa è difficile da decifrare, anche se tutte le comunicazioni sono monitorate.

Come funziona Diffie-Hellman?
Diffie-Hellman è quello che viene chiamato un protocollo di scambio di chiavi. Questo è l'uso principale per Diffie-Hellman, anche se potrebbe essere utilizzato anche per la crittografia (in genere non lo è, perché è più efficiente utilizzare DH per scambiare le chiavi, quindi passare a una crittografia simmetrica (significativamente più veloce) per la trasmissione dei dati ).

Il modo in cui funziona è il seguente:

Come funziona Diffie-Hellman?


https://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange#/media/File:Diffie-Hellman_Key_Exchange.svg


Fondamentalmente, ci sono due parti, Alice e Bob, che concordano su un colore iniziale (arbitrario ma deve essere diverso ogni volta). Hanno anche un colore segreto che mantengono per sé. 

Quindi mescolano questo colore con il colore condiviso, risultando in due colori diversi. Quindi passano questo colore all'altra parte, che lo mescola con il loro colore segreto, ottenendo lo stesso colore segreto finale.

Ciò si basa sull'idea che è relativamente facile mescolare due colori insieme, ma è molto difficile separarli per trovare il colore segreto. In pratica, questo viene fatto con la matematica.

Per esempio:

Bob e Alice concordano su due numeri, un primo grande, p = 29 e base g = 5

Ora Bob sceglie un numero segreto, x (x = 4) e fa quanto segue: X = g ^ x% p (in questo caso% indica il resto. Ad esempio 3% 2 è 3/2, dove il resto è 1) . X = 5 ^ 4% 29 = 625% 29 = 16

Alice sceglie anche un numero segreto, y (y = 8) e fa quanto segue: Y = g ^ y% p. Y = 5 ^ 8% 29 = 390.625% 29 = 24
Bob invia X ad Alice e Alice invia Y a Bob.

Quindi Bob esegue le seguenti operazioni: K = Y ^ x% p, K = 24 ^ 4% 29 = 331.776% 29 = 16

Alice quindi effettua le seguenti operazioni: K = X ^ y% p, K = 16 ^ 8% 29 = 4.294.967.296% 29 = 16

La cosa fantastica (* forse magica *) di questo, è che sia Bob che Alice hanno lo stesso numero, K, e ora possono usarlo per parlare in segreto, perché nessun altro conosce K.

La sicurezza di questo protocollo si basa su alcune cose:

(Fatto) È relativamente facile generare numeri primi, anche numeri primi grandi (come p).

(Fatto) L'esponenziazione modulare è semplice. In altre parole, è relativamente facile calcolare X = g ^ x% p.

(Presupposto basato sull'attuale potenza di calcolo e matematica) L'estrazione di radici modulari senza i fattori primi è molto difficile. In sostanza, è molto difficile trovare K senza conoscere xey, anche se hai ficcato il naso nel traffico e puoi vedere p, g, X e Y.

Quindi, supponendo che questo sia stato implementato correttamente, è relativamente facile fare i calcoli necessari per creare la chiave, ma è estremamente difficile e richiede molto tempo fare i calcoli necessari per cercare di rompere la chiave forzandola bruta.

Anche se un attaccante potrebbe compromettere questa chiave, Diffie-Hellman consente una perfetta segretezza in avanti.

Cos'è il perfetto segreto in avanti?

Questa è l'idea che se decifri la crittografia che il server sta usando per comunicare ora, ciò non significa che tutte le comunicazioni che il server abbia mai effettuato siano in grado di essere lette.

In altre parole, ti consente solo di vedere le comunicazioni che vengono utilizzate ora (cioè con questa chiave segreta). Poiché ogni set di comunicazioni ha una chiave segreta diversa, dovresti decifrarle tutte separatamente.

Questo è possibile se ogni sessione ha una chiave diversa ed effimera per ogni sessione. Poiché Diffie-Hellman utilizza sempre nuovi valori casuali per ogni sessione, (quindi generando nuove chiavi per ogni sessione), si chiama Ephemeral Diffie Hellman (EDH o DHE).

Molte suite di crittografia usano questo per ottenere il perfetto segreto in avanti.

Poiché Diffie-Hellman ti consente di scambiare materiale chiave in chiaro senza preoccuparti di compromettere il segreto condiviso, e la matematica è troppo complicata per un aggressore per la forza bruta, l'attaccante non può derivare la chiave di sessione (e anche se potesse, usando chiavi diverse, effimere, per ogni sessione significano che possono solo curiosare in questa sessione, nessuna nel passato o nel futuro).

Il segreto in avanti è abilitato con qualsiasi scambio di chiavi Diffie-Hellman, ma solo lo scambio di chiavi effimero (una chiave diversa per ogni sessione) fornisce un perfetto segreto in avanti.

Ecco un post di Scott Helme che ne parla in modo più approfondito e spiega come abilitarlo sui tuoi server.


Quali sono i limiti di Diffie-Hellman?


Il limite più grande di DH è che non è verificare l'identità. In altre parole, chiunque può affermare di essere Alice o Bob e non esiste un meccanismo incorporato per verificare che la propria affermazione sia vera.

Inoltre, se l'implementazione non viene eseguita in modo sicuro, l'algoritmo potrebbe essere crackato con sufficienti risorse dedicate (improbabile, ma possibile per team accademici o attori dello stato-nazione).

Ad esempio, ciò potrebbe verificarsi se al generatore di numeri casuali non viene fornita un'entropia adeguata per supportare la forza desiderata - in altre parole, poiché i numeri generati dal computer non sono mai veramente casuali, il grado in cui hai iniettato artificialmente l'incertezza è importante per la forza della tua implementazione.

Inoltre, nel 2015 è stato dimostrato un attacco che ha dimostrato che quando gli stessi numeri primi sono stati utilizzati da molti server come l'inizio dello scambio di chiavi, la sicurezza complessiva di Diffie-Hellman era inferiore alle aspettative.

In sostanza, un utente malintenzionato potrebbe semplicemente pre-calcolare l'attacco contro quel numero primo, rendendo più semplice compromettere le sessioni per qualsiasi server che ha utilizzato quel numero primo.

Ciò si è verificato perché milioni di server utilizzavano gli stessi numeri primi per gli scambi di chiavi. Il pre-calcolo di questo tipo di attacco richiede ancora risorse a livello accademico o di stato-nazione ed è improbabile che abbia un impatto sulla stragrande maggioranza delle persone.

Tuttavia, fortunatamente per coloro che devono preoccuparsi degli aggressori dello stato-nazione, esiste un modo diverso per ottenere lo scambio di chiavi DH usando la crittografia a curva ellittica (ECDHE). Questo non rientra nell'ambito di questo articolo, ma se sei interessato a saperne di più sulla matematica alla base di questo scambio, dai un'occhiata a questo articolo .

Per uno sguardo più dettagliato alle debolezze di DH, dai un'occhiata a questo white paper e a questo sito Web.

RSA


RSA prende il nome dai creatori - Rivest, Shamir, Adleman - ed è un modo per generare chiavi pubbliche e private.

Tecnicamente ci sono due algoritmi RSA (uno usato per le firme digitali e uno usato per la crittografia asimmetrica). Questo articolo tratta l'algoritmo di crittografia asimmetrica.

Ciò consente lo scambio di chiavi: in primo luogo si assegna a ciascuna parte le chiavi pubbliche / private di transazione, quindi si genera una chiave simmetrica e infine si utilizzano le coppie di chiavi pubbliche / private per comunicare in modo sicuro la chiave simmetrica condivisa.

Poiché la crittografia asimmetrica è generalmente più lenta della crittografia simmetrica e non si ridimensiona, l'utilizzo della crittografia asimmetrica per scambiare in modo sicuro chiavi simmetriche è molto comune.

Quindi, come funziona?


Scegli 2 numeri primi molto grandi (almeno 512 bit o 155 cifre decimali ciascuno), xey (questi numeri devono essere segreti e scelti casualmente)

Trova il prodotto, ovvero z = x * y

Seleziona un intero pubblico dispari, e, tra 3 e n - 1, e non ha fattori comuni (diversi da 1) con (x-1) (y-1) (quindi è relativamente primo per x - 1 e y - 1 ).

Trova il minimo comune multiplo di x - 1 e y - 1 e chiamalo L.

Calcola l'esponente privato, d, da x, y ed e. de = 1% L. d è l'inverso di e% L (sai che esiste un inverso perché e è relativamente primo a z - 1 e y - 1). Questo sistema funziona perché p = (p ^ e) ^ d% z.

Output (z, e) come chiave pubblica e (z, d) come chiave privata.

Ora, se Bob desidera inviare un messaggio ad Alice, genera il testo cifrato (C) dal testo normale (P) usando questa formula:

C = P ^ e% z

Per decrittografare questo messaggio, Alice calcola quanto segue:

P = C ^ d% z

La relazione tra d ed e assicura che le funzioni di crittografia e decrittazione siano inverse. Ciò significa che la funzione di decodifica è in grado di ripristinare correttamente il messaggio originale e che è piuttosto difficile ripristinare il messaggio originale senza la chiave privata (z, d) (o i fattori primi x e y).

Ciò significa anche che è possibile rendere pubblici z e e senza compromettere la sicurezza del sistema, facilitando la comunicazione con gli altri con i quali non si dispone già di una chiave segreta condivisa.

È inoltre possibile utilizzare le operazioni al contrario per ottenere una firma digitale del messaggio. Innanzitutto, si utilizza l'operazione di decodifica sul testo in chiaro. Ad esempio, s = FIRMA (p) = p ^ d% z.

Quindi, il destinatario può verificare la firma digitale applicando la funzione di crittografia e confrontando il risultato con il messaggio. Ad esempio, m = VERIFY (s) = S ^ e% z.

Spesso quando questo è fatto, il testo in chiaro è un hash del messaggio, il che significa che puoi firmare il messaggio (indipendentemente dalla lunghezza) con una sola esponenziazione.

La sicurezza del sistema si basa su alcune cose:


(Fatto) È relativamente facile generare numeri primi, anche numeri primi grandi (come xey).

(Fatto) La moltiplicazione è facile. È molto facile trovare z.

(Presupposto basato sulla matematica attuale) Il factoring è difficile. Dato z, è relativamente difficile recuperare xey. È fattibile, ma richiede un po 'di tempo ed è costoso.

Una stima afferma che il recupero dei fattori primi di un numero a 1024 bit richiederebbe un anno su una macchina che costa $ 10 milioni.

Raddoppiare le dimensioni aumenterebbe esponenzialmente la quantità di lavoro necessario (diversi miliardi di volte più lavoro).

Mentre la tecnologia continua ad avanzare, questi costi (e il lavoro richiesto) diminuiranno, ma a questo punto, questo tipo di crittografia, correttamente implementato, è una fonte improbabile di compromesso.


Generalmente gli unici hacker con questo tipo di denaro e dedizione a un singolo obiettivo sono gli stati-nazione. Inoltre, se esiste un modo più semplice per compromettere un sistema (vedi sotto), questa è probabilmente un'opzione migliore.


4. (Fatto) L'esponenziazione modulare è semplice. In altre parole, è relativamente facile calcolare c = p ^ e% z.

5. (Fatto) L'estrazione modulare delle radici - invertendo il processo sopra descritto - è facile se si hanno i fattori primi (se si hanno z, c, e, e i fattori primi xey, è facile trovare p tale che c = p ^ e% z).

6. (Ipotesi basata sull'attuale potenza di calcolo e matematica) L'estrazione della radice modulare senza i fattori primi è molto difficile (se hai z, c, e, ma non xey, è relativamente difficile trovare p tale che c = p ^ e% z, in particolare se a è sufficientemente grande).

Vuoi saperne di più sulla matematica da persone molto più intelligenti? Dai un'occhiata a questo articolo.


Ottimo, che è meglio?


Dipende dal tuo caso d'uso. Ci sono alcune differenze tra i due algoritmi: primo, il segreto perfetto in avanti (PFS), di cui abbiamo parlato in precedenza nel contesto di Diffie-Hellman. Anche se tecnicamente si potrebbe generare coppie di chiavi RSA effimere, e fornire Perfect Forward Secrecy con RSA, il costo computazionale è molto più alto rispetto a Diffie-Hellman - il che significa che Diffie-Hellman è una scelta migliore per le implementazioni SSL / TLS in cui si desidera Perfect Forward Secrecy .  

Mentre ci sono alcune differenze di prestazioni tra i due algoritmi (in termini di lavoro richiesto dal server), le differenze di prestazioni generalmente non sono abbastanza grandi da fare la differenza quando si sceglie l'una rispetto all'altra.

Invece, in generale, la considerazione principale quando si determina quale è meglio dipende da quale è più supportato per il proprio caso d'uso (ad esempio, quando si implementa SSL si vorrà Diffie Hellman a causa del perfetto segreto in avanti) o quale è più popolare o accettato come standard nel settore.

Ad esempio, mentre Diffie-Hellman è stato approvato dal governo degli Stati Uniti e supportato da un ente istituzionale, lo standard non è stato rilasciato - mentre RSA (standardizzato da un'organizzazione privata) ha fornito uno standard gratuito, il che significa che RSA è diventato molto popolare tra le organizzazioni private.

Se siete interessati a saperne di più, c'è una grande discussione qui sulle differenze.


Ti interessa imparare come gli hacker usano gli attacchi crittografici? Prova questa serie di sfide da Cryptopals.


FONTE: https://www.freecodecamp.org/news/understanding-encryption-algorithms/

Post popolari in questo blog

Qual è l'ultima versione di Android? E come aggiornare l'attuale sistema operativo Android?

Il miglior software di mining di Bitcoin recensito