[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:00.00,0:00:04.01,Default,,0000,0000,0000,,In questa sezione, voglio dare alcuni esempi di stream cipher che vengono effettivamente utilizzati Dialogue: 0,0:00:04.01,0:00:07.07,Default,,0000,0000,0000,,Inizierò con due vecchi esempi che in realtà non Dialogue: 0,0:00:07.07,0:00:11.02,Default,,0000,0000,0000,,si suppone vengano utilizzati in nuovi sistemi. Comunque, essi sono ancora piuttosto largamente utilizzati Dialogue: 0,0:00:11.02,0:00:14.16,Default,,0000,0000,0000,,e quindi voglio citarne semplicemente i nomi, in modo che voi possiate famigliarizzare con Dialogue: 0,0:00:14.16,0:00:19.09,Default,,0000,0000,0000,,questi concetti. Il primo stream cipher di cui voglio parlarvi è chiamato RC4, progettato Dialogue: 0,0:00:19.09,0:00:23.43,Default,,0000,0000,0000,,nel lontano 1987. Ve ne darò una descrizione ad alto livello e quindi Dialogue: 0,0:00:23.43,0:00:27.82,Default,,0000,0000,0000,,parleremo di alcune debolezze di RC4 e ci fermeremo lì. RC4 utilizza Dialogue: 0,0:00:27.82,0:00:32.70,Default,,0000,0000,0000,,un seme di lunghezza variabile; qui ho presentato un esempio dove sono stati utilizzati 128 Dialogue: 0,0:00:32.70,0:00:36.98,Default,,0000,0000,0000,,bit come lunghezza del seme, che verrà utilizzato come chiave per lo stream cipher. Dialogue: 0,0:00:36.98,0:00:41.74,Default,,0000,0000,0000,,La prima cosa che fa, è espandere la chiave segreta di 128 but in un 2.048 bit, che Dialogue: 0,0:00:41.74,0:00:46.38,Default,,0000,0000,0000,,verranno utilizzati come stato interno per il generatore. Quindi, una volta che questa espansione è stata terminata, Dialogue: 0,0:00:46.38,0:00:51.20,Default,,0000,0000,0000,,esso esegue in pratica un loop molto semplice, dove ogni iterazione produce come Dialogue: 0,0:00:51.20,0:00:55.90,Default,,0000,0000,0000,,output un byte. Quindi, essenzialmente, voi potete far eseguire il generatore per Dialogue: 0,0:00:55.90,0:01:00.65,Default,,0000,0000,0000,,quanto tempo vogliate e generare un byte alla volta. Ora, RC4 è in pratica, come ho detto, Dialogue: 0,0:01:00.65,0:01:05.20,Default,,0000,0000,0000,,largamente popolare. Viene utilizzato in realtà piuttosto comunemente nel protocollo HTTPS. Dialogue: 0,0:01:05.20,0:01:11.89,Default,,0000,0000,0000,,In questi giorni, ad esempio, Google usa RC4 nel suo HTTPS. Viene utilizzato anche nel WEP, come abbiamo Dialogue: 0,0:01:11.89,0:01:15.69,Default,,0000,0000,0000,,discusso nell'ultima sezione, ma ovviamente in WEP esso è usato in maniera sbagliata e Dialogue: 0,0:01:15.69,0:01:18.86,Default,,0000,0000,0000,,il modo in cui viene utilizzato in WEP è assolutamente insicuro. Così, nel corso degli anni, Dialogue: 0,0:01:18.86,0:01:23.89,Default,,0000,0000,0000,,sono state trovate alcune debolezze in RC4 a, di conseguenza, si raccomanda che i nuovi progetti Dialogue: 0,0:01:23.89,0:01:28.79,Default,,0000,0000,0000,,non usino in effetti RC4, ma piuttosto un generatore pseudo-random più moderno, come Dialogue: 0,0:01:28.79,0:01:34.06,Default,,0000,0000,0000,,discuteremo verso la fine della sezione. QUindi, lasciatemi citare due delle debolezze. Dialogue: 0,0:01:34.06,0:01:39.56,Default,,0000,0000,0000,,La prima si trova (è qualcosa di bizzarro, fondamentalmente): se guardate al secondo byte Dialogue: 0,0:01:39.56,0:01:44.63,Default,,0000,0000,0000,,dell'output di RC4. Risulta che il secondo byte è leggermente polarizzato. Se RC4 fosse Dialogue: 0,0:01:44.63,0:01:49.78,Default,,0000,0000,0000,,completamente random, la probabilità che il secondo byte sia zero Dialogue: 0,0:01:49.78,0:01:54.74,Default,,0000,0000,0000,,sarebbe esattamente l'inverso di 256. Ci sono 256 possibili byte, la probabilità che Dialogue: 0,0:01:54.74,0:01:59.65,Default,,0000,0000,0000,,sia zero dovrebbe essere uno su 256. Succede invece che per RC4 la probabilità sia Dialogue: 0,0:01:59.65,0:02:04.49,Default,,0000,0000,0000,,in effetti due su 256, che significa che se usate l'output di RC4 per criptare un Dialogue: 0,0:02:04.49,0:02:09.57,Default,,0000,0000,0000,,messaggio, il secondo byte sia possibilmente non criptato del tutto. In altre parole, esso Dialogue: 0,0:02:09.57,0:02:14.58,Default,,0000,0000,0000,,sarà in XOR con zero due volte la probabilità che si suppone debba succedere. Dialogue: 0,0:02:14.58,0:02:19.44,Default,,0000,0000,0000,,Quindi, due su 256 invece che uno su 256. E, tra l'altro, dovrei dire che non c'è Dialogue: 0,0:02:19.44,0:02:22.85,Default,,0000,0000,0000,,nulla di speciale circa il secondo byte. Risulta però che anche il primo e il terzo byte Dialogue: 0,0:02:22.85,0:02:27.82,Default,,0000,0000,0000,,sono anche polarizzati. E' infatti ora raccomandato che se intendete usare RC4 Dialogue: 0,0:02:27.82,0:02:32.80,Default,,0000,0000,0000,,ciò che dovreste fare è in pratica ignorare i primi 256 byte dell'output e giusto Dialogue: 0,0:02:32.80,0:02:37.25,Default,,0000,0000,0000,,iniziare usando l'output del generatore iniziando dal byt 257. La prima coppia Dialogue: 0,0:02:37.25,0:02:41.24,Default,,0000,0000,0000,,di byte risultano essere polarizzati, quindi semplicemente ignorateli. Il secondo attacco che Dialogue: 0,0:02:41.24,0:02:48.48,Default,,0000,0000,0000,,venne scoperto è che in effetti, se guardate a un output molto lungo di RC4, capita che Dialogue: 0,0:02:48.48,0:02:53.86,Default,,0000,0000,0000,,sia più facile ottenere la sequenza 00. In altre parole, è più facile Dialogue: 0,0:02:53.86,0:02:58.97,Default,,0000,0000,0000,,che otteniate sedici bit (due byte) di zero di quanto dobbiate. Di nuovo, se RC4 Dialogue: 0,0:02:58.97,0:03:03.95,Default,,0000,0000,0000,,fosse completamente random, la probabilità di vedere zero, zero sarebbe esattamebte il quadrato di 1/256. Dialogue: 0,0:03:03.95,0:03:08.56,Default,,0000,0000,0000,,Risulta che RC4 è leggermente polarizzato e la polarizzazione sia il cubo di 1/256. Dialogue: 0,0:03:08.56,0:03:13.72,Default,,0000,0000,0000,,Risulta che questa polarizzazione in effetti inizi dopo che diversi GByte di dati siano stati prodotti Dialogue: 0,0:03:13.72,0:03:18.63,Default,,0000,0000,0000,,da RC4. Ma ciononostante, questo è qualcosa che può essere usato per predirre il generatore e Dialogue: 0,0:03:18.63,0:03:23.12,Default,,0000,0000,0000,,in definitiva può essere usato per distinguere l'output del generatore Dialogue: 0,0:03:23.12,0:03:28.10,Default,,0000,0000,0000,,da una vera sequenza casuale. Fondamentalmente, il fatto che zero, zero appaia più spesso Dialogue: 0,0:03:28.10,0:03:32.41,Default,,0000,0000,0000,,di quanto dovrebbe è il discriminante. E quindi nell'ultima sezione abbiamo parlato degli Dialogue: 0,0:03:32.41,0:03:36.31,Default,,0000,0000,0000,,attacchi basati su chiavi connesse che sono stati usati per attaccare WEP, che in pratica dicono che se Dialogue: 0,0:03:36.31,0:03:41.08,Default,,0000,0000,0000,,qualcuno usa chiavi che sono strettamente connesse l'una con l'altra, allora è in effetti possibile Dialogue: 0,0:03:41.08,0:03:45.73,Default,,0000,0000,0000,,recuperare la chiave principale. Quindi queste sono debolezze che sono conosciute per RC4 e quindi Dialogue: 0,0:03:45.73,0:03:50.22,Default,,0000,0000,0000,,si raccomanda che nuovi sistemi in effetti non usino RC4 e invece usino Dialogue: 0,0:03:50.22,0:03:54.42,Default,,0000,0000,0000,,generatori pseudo-casuali moderni. OK, il secondo esempio che voglio darvi è uno Dialogue: 0,0:03:54.42,0:03:59.13,Default,,0000,0000,0000,,stream cipher usato per criptare film DVD malamente scardinato. Quando comprate un DVD Dialogue: 0,0:03:59.13,0:04:03.50,Default,,0000,0000,0000,,in negozio, il film è criptato usando uno stream cipher chiamato Dialogue: 0,0:04:03.50,0:04:07.93,Default,,0000,0000,0000,,sistema di scrambling del contenuto (CSS, Content Scrambling System). CSS risulta essere uno stream cipher malamente scardinato, Dialogue: 0,0:04:07.93,0:04:12.52,Default,,0000,0000,0000,,e possiamo scardinarlo molto semplicemente. Ora voglio mostrarvi come funziona l'algoritmo di attacco. Dialogue: 0,0:04:12.52,0:04:16.89,Default,,0000,0000,0000,,Faro' in modo di mostrarvi un esempio di algoritmo di attacco, ma, Dialogue: 0,0:04:16.89,0:04:21.44,Default,,0000,0000,0000,,in effetti, ci sono molti system che fondamentalmente usano questo attacco per decrittare Dialogue: 0,0:04:21.44,0:04:25.75,Default,,0000,0000,0000,,DVD criptati. Lo stream cipher CSS è basato su qualcosa che piace Dialogue: 0,0:04:25.75,0:04:30.29,Default,,0000,0000,0000,,ai progettisti hardware. E' progettato per essere uno stream cipher che si suppone Dialogue: 0,0:04:30.29,0:04:34.49,Default,,0000,0000,0000,,sia facilmente implementabile in hardware ed è basato su un meccanismo chiamato registro di scorrimento a retroazione Dialogue: 0,0:04:34.49,0:04:38.75,Default,,0000,0000,0000,,lineare. Un registro a scorrimento con retroazione lineare è fondamentalmente un registro Dialogue: 0,0:04:38.75,0:04:43.80,Default,,0000,0000,0000,,che consiste in celle, dove ogni cella contiene un bit. Dialogue: 0,0:04:43.80,0:04:49.05,Default,,0000,0000,0000,,Ciò che succede è che ci sono rubinetti in alcune celle (non tutte), cioè certe Dialogue: 0,0:04:49.05,0:04:54.13,Default,,0000,0000,0000,,possizioni vengono chiamate "rubinetti". Questi rubinetti alimentano uno XOR e quindi Dialogue: 0,0:04:54.13,0:04:59.05,Default,,0000,0000,0000,,ad ogni colpo di clock, il registro scorre di un bit a sinistra. L'ultimo bit di sinistra viene scartato Dialogue: 0,0:04:59.05,0:05:04.34,Default,,0000,0000,0000,,e quindi il primo bit diventa il risultato di questo XOR. Potete quindi vedere che Dialogue: 0,0:05:04.34,0:05:08.70,Default,,0000,0000,0000,,questo è un meccanismo molto semplice da implementare e in hardware impiega veramente Dialogue: 0,0:05:08.70,0:05:13.62,Default,,0000,0000,0000,,pochi transistors. Giusto lo scorrimento, lo scarto dell'ultimo bit e l'aggiunta di un but Dialogue: 0,0:05:13.62,0:05:18.54,Default,,0000,0000,0000,,che diventa lo XOR di alcuni bits precedenti. Ciò che serve a questo registro è Dialogue: 0,0:05:18.54,0:05:23.46,Default,,0000,0000,0000,,fondamentalmente lo stato iniziale. Dialogue: 0,0:05:23.65,0:05:28.54,Default,,0000,0000,0000,,E questo è la base di un certo numero di stream ciphers. Qui vengono presentati alcuni esempi. Dialogue: 0,0:05:28.54,0:05:33.36,Default,,0000,0000,0000,,Come ho detto, la crittografia dei DVD usa due registri di questo tipo. Vi mostrerò come funziona tra un secondo. Dialogue: 0,0:05:33.36,0:05:38.06,Default,,0000,0000,0000,,Per quanto riguarda la crittografia GSM, ci sono algoritmi chiamati A51 e A52. E questi Dialogue: 0,0:05:38.06,0:05:43.46,Default,,0000,0000,0000,,usano tre registri di questo tipo. La crittografia Bluetooth è un algoritmo chiamato E zero. Questi sono tutti Dialogue: 0,0:05:43.46,0:05:48.53,Default,,0000,0000,0000,,stream ciphers, ed usano tutti quattro registri di questo tipo. Risulta che tutti questi cifratori sono stati scardinati malamente ed Dialogue: 0,0:05:48.53,0:05:53.24,Default,,0000,0000,0000,,in realtà non dovrebbero assolutamente essere considerati attendibili per traffico cifrato, ma sono tutti Dialogue: 0,0:05:53.24,0:05:56.70,Default,,0000,0000,0000,,implementati in hardware, quindi è alquanto difficile oggi cambiare ciò che viene fatto in hardware. Dialogue: 0,0:05:56.70,0:06:01.05,Default,,0000,0000,0000,,Ma il più semplice di tutti, CSS, in realtà ha un attacco carino che funziona su di esso, quindi lasciatemi Dialogue: 0,0:06:01.05,0:06:05.46,Default,,0000,0000,0000,,descrivere come funziona questo attacco. Prima di tutto vediamo come effettivamente funziona CSS. Dialogue: 0,0:06:05.46,0:06:11.07,Default,,0000,0000,0000,,la chiave di CSS è di cinque bytes, cioè 40 bits (5 volte 8 bit è 40 bit). Dialogue: 0,0:06:11.07,0:06:15.59,Default,,0000,0000,0000,,La ragione per cui hanno dovuto limitarsi a solo 40 bitsè che la cifratura dei DVD è stata progettata Dialogue: 0,0:06:15.59,0:06:19.94,Default,,0000,0000,0000,,in tempi in cui la legislazione per l'esportazione negli US permetteva solo di esportare algoritmi Dialogue: 0,0:06:19.94,0:06:25.09,Default,,0000,0000,0000,,di cifratura dove la chiave fosse solo di 40 bits. Quindi i progettisti di CSS Dialogue: 0,0:06:25.09,0:06:30.21,Default,,0000,0000,0000,,erano già limitati a chiavi molto, motlo corte. Solo 40 bits. Quindi il loro progetto funziona Dialogue: 0,0:06:30.21,0:06:35.40,Default,,0000,0000,0000,,in questo modo. Fondamentalmente, CSS usa due registri a scorrimento. Uno è a 17 bit. In altre parole Dialogue: 0,0:06:35.40,0:06:40.81,Default,,0000,0000,0000,,il registro contiene 17 bit. E l'altro è di 25 bit. Dialogue: 0,0:06:40.81,0:06:46.65,Default,,0000,0000,0000,,un pò più lungo, 25 bit. E il modo in cui questi registri vengono alimentati Dialogue: 0,0:06:46.65,0:06:51.87,Default,,0000,0000,0000,,è il seguente. Quindi la chiave per la cifratura, fondamentalmente è come segue. Dialogue: 0,0:06:51.87,0:06:57.67,Default,,0000,0000,0000,,Si inizia con un uno, che viene concatenato con i primi due byte Dialogue: 0,0:06:57.67,0:07:02.95,Default,,0000,0000,0000,,della chiave. E questo è lo stato iniziale del registro. Dialogue: 0,0:07:02.95,0:07:08.26,Default,,0000,0000,0000,,Il secondo registro fondamentalmente viene inizializzato nello stesso modo. Dialogue: 0,0:07:08.26,0:07:14.01,Default,,0000,0000,0000,,uno concatenato con gli ultimi tre byte della chiave. E questo Dialogue: 0,0:07:14.01,0:07:19.89,Default,,0000,0000,0000,,viene caricato nello stato iniziale del registro. Potete vedere che i primi due byte Dialogue: 0,0:07:19.89,0:07:25.41,Default,,0000,0000,0000,,sono 16 bit, più il primo 1, che sono 17 bit in tutto, mentre il secondo Dialogue: 0,0:07:25.41,0:07:31.22,Default,,0000,0000,0000,,registro è di 24 bit più un 1 che fa 25 bit. Notate che abbiamo usato tutti i cinque bit Dialogue: 0,0:07:31.22,0:07:36.88,Default,,0000,0000,0000,,della chiave. Quindi questi registri vengono fatti scorrere per otto cicli, generando Dialogue: 0,0:07:36.88,0:07:42.33,Default,,0000,0000,0000,,8 bit di output. Quindi questi bit vanno un un sommatore che fa in pratica una Dialogue: 0,0:07:42.33,0:07:48.20,Default,,0000,0000,0000,,somma modulo 256. Corretto, questa è un blocco di addizione modulo 256. C'è inoltre un'altra cosa Dialogue: 0,0:07:48.20,0:07:54.32,Default,,0000,0000,0000,,che succede. Infatti Infatti... viene aggiunto anche una parte derivante Dialogue: 0,0:07:54.32,0:07:59.72,Default,,0000,0000,0000,,dal blocco precedente. Ma questo non è importante. Questo è un dettaglio che non è rilevante. Dialogue: 0,0:07:59.72,0:08:04.76,Default,,0000,0000,0000,,OK, qundi in ogni blocco notate che facciamo un'addizione modulo 256 Dialogue: 0,0:08:04.76,0:08:09.98,Default,,0000,0000,0000,,e stiamo ignorando la parte derivante dal blocco precedente, che però è semplicemente l'addizione di uno 0 o un 1 Dialogue: 0,0:08:09.98,0:08:15.15,Default,,0000,0000,0000,,all'addizione del blocco successivo. OK? Quindi in pratica questo produce un byte per ciclo. Dialogue: 0,0:08:15.15,0:08:20.41,Default,,0000,0000,0000,,OK, quindi questo byte viene ovviamente usato, messo in XOR con il relativo Dialogue: 0,0:08:20.41,0:08:25.17,Default,,0000,0000,0000,,byte del film che è stato criptato. OK, quindi questo è uno stream cipher molto semplice e Dialogue: 0,0:08:25.17,0:08:29.99,Default,,0000,0000,0000,,impiega molto poco hardware per essere implementato. Viene eseguito velocemente, persino su Dialogue: 0,0:08:29.99,0:08:35.83,Default,,0000,0000,0000,,hardware molto economico e può criptare film. Risulta che questo sia facilmente scardinabile in un tempo Dialogue: 0,0:08:35.83,0:08:41.22,Default,,0000,0000,0000,,proporzionale a 2 alla 17. Lasciatemi mostrare come. Dialogue: 0,0:08:41.22,0:08:45.73,Default,,0000,0000,0000,,Supponiamo che voi intercettiate il film. Quindi abbiamo un Dialogue: 0,0:08:45.73,0:08:50.65,Default,,0000,0000,0000,,film criptato e voi volete decrittarlo. Quindi, diciamo che questo e completamente criptato in modo Dialogue: 0,0:08:50.65,0:08:55.28,Default,,0000,0000,0000,,che non abbiate alcuna idea di cosa ci sia dentro. Comunque, si da il caso che, poichè Dialogue: 0,0:08:55.28,0:08:59.97,Default,,0000,0000,0000,,la cifratura DVD usa file MPEG, succede che voi sappiate il prefisso del Dialogue: 0,0:08:59.97,0:09:04.25,Default,,0000,0000,0000,,file in chiaro, diciamo una ventina di byte. Bene, sappiamo che se fate lo XOR Dialogue: 0,0:09:04.25,0:09:08.59,Default,,0000,0000,0000,,di queste due cose insieme, cioè in altre parole, fate lo XOR qui, Dialogue: 0,0:09:08.59,0:09:13.52,Default,,0000,0000,0000,,Ciò che ottenete è il segmento iniziale del PRG. Quindi voi ottenete Dialogue: 0,0:09:13.52,0:09:18.47,Default,,0000,0000,0000,,i primi 20 byte dell'output del CSS, l'output di questo PRG. OK, quindi Dialogue: 0,0:09:18.47,0:09:23.99,Default,,0000,0000,0000,,ora questo è ciò che faremo. Abbiamo i primi 20 bytes dell'output. Ora Dialogue: 0,0:09:23.99,0:09:31.40,Default,,0000,0000,0000,,faremo ciò che segue. Tentiamo tutti i 2^17 possibili valori del primo Dialogue: 0,0:09:31.40,0:09:37.09,Default,,0000,0000,0000,,registro. OK? Quindi tutti i 2^17 valori. Per ogni tentativo, cioè Dialogue: 0,0:09:37.09,0:09:42.62,Default,,0000,0000,0000,,per ognuno di questi 2^17 valori iniziali del registro, faremo scorrere Dialogue: 0,0:09:42.62,0:09:47.95,Default,,0000,0000,0000,,i registri per venti byte, ok? Quindi genereremo 20 byte di output da questo Dialogue: 0,0:09:47.95,0:09:53.28,Default,,0000,0000,0000,,primo registro, assumendo... per ognuno dei 2^17 possibili settaggi. Dialogue: 0,0:09:53.28,0:09:58.62,Default,,0000,0000,0000,,Ora, considerate che conosciamo l'output completo del sistema CSS, Quindi ciò cjhe possiamo fare è Dialogue: 0,0:09:58.62,0:10:03.81,Default,,0000,0000,0000,,prendere questo output che conosciamo e sottrarlo dai venti byte che Dialogue: 0,0:10:03.81,0:10:08.93,Default,,0000,0000,0000,,abbiamo ottenuto dal primo registro. Se in effetti il nostro tentativo per lo stato iniziale del primo registro Dialogue: 0,0:10:08.93,0:10:14.04,Default,,0000,0000,0000,,è corretto, ciò che dovremmo ottenere sono i primi 20 byte del Dialogue: 0,0:10:14.04,0:10:19.22,Default,,0000,0000,0000,,secondo registro. Giusto? Perchè questo è per definizione l'output del sistema CSS. Dialogue: 0,0:10:19.22,0:10:24.50,Default,,0000,0000,0000,,Ora, risulta che guardando la sequenza di 20 byte, è molto semplice Dialogue: 0,0:10:24.50,0:10:29.76,Default,,0000,0000,0000,,dire se questa sequenza di 20 byte è uscita dal secondo registro oppure no. Se non lo è Dialogue: 0,0:10:29.76,0:10:33.56,Default,,0000,0000,0000,,sappiamo che il nostro tentativo per il primo registro a 17 bit era Dialogue: 0,0:10:33.56,0:10:37.42,Default,,0000,0000,0000,,incorretto e quindi andiamo avanti con il prossimo tentativo per il registro a 17 bit e Dialogue: 0,0:10:37.42,0:10:41.90,Default,,0000,0000,0000,,quindi quello successivo e così via. Finchè alla fine indoviniamo lo stato iniziale corretto Dialogue: 0,0:10:41.90,0:10:46.94,Default,,0000,0000,0000,,pòer il registro a 17 bit e quindi siamo arrivati, vedremo che Dialogue: 0,0:10:46.94,0:10:51.97,Default,,0000,0000,0000,,i 20 byte che otteniamo come output candidato dal registro a 25 bit è Dialogue: 0,0:10:51.97,0:10:56.94,Default,,0000,0000,0000,,in effetti un possibile output per il registro a 25 bit. E ora, non solo abbiamo Dialogue: 0,0:10:56.94,0:11:02.16,Default,,0000,0000,0000,,imparato il corretto stato iniziale per il registro a 17 bit, noi avremo anche Dialogue: 0,0:11:02.16,0:11:07.52,Default,,0000,0000,0000,,imparato il corretto stato iniziale del registro a 25 bit. E quindi possiamo predirre l'output Dialogue: 0,0:11:07.52,0:11:12.80,Default,,0000,0000,0000,,rimanente del CSS e, ovviamnte, usando questo, possiamo decrittare il resto del Dialogue: 0,0:11:12.80,0:11:17.56,Default,,0000,0000,0000,,film. Possiamo recuperare la rimanente parte in chiaro. Ok. Questo è ciò Dialogue: 0,0:11:17.56,0:11:22.34,Default,,0000,0000,0000,,di cui abbiamo parlato prima. L'ho spiegato un pò velocemente, ma, spero, chiaramente. Dialogue: 0,0:11:22.34,0:11:27.33,Default,,0000,0000,0000,,Stiamo per fare un esercizio come compito a casa su questo tipo di stream ciphers Dialogue: 0,0:11:27.33,0:11:31.44,Default,,0000,0000,0000,,e voi potrete capire come questi algoritmi di attacco Dialogue: 0,0:11:31.44,0:11:36.02,Default,,0000,0000,0000,,funzionano. Dovrei dire che ci sono diversi sistemi open-source oggi che in realtà Dialogue: 0,0:11:36.02,0:11:41.45,Default,,0000,0000,0000,,usano questo metodo per decrittare dati criptati con CSS. OK, quindi ora che abbiamo visto due Dialogue: 0,0:11:41.45,0:11:45.89,Default,,0000,0000,0000,,esempi deboli, spostiamoci verso esempi migliori, e in particolare Dialogue: 0,0:11:45.89,0:11:49.37,Default,,0000,0000,0000,,i generatori pseudo-random che vengono da quello che viene chiamato il Progetto eStream. Questo è un Dialogue: 0,0:11:49.37,0:11:55.56,Default,,0000,0000,0000,,progetto che si è concluso nel 2008 e che ha qualificato cinque diversi stream Dialogue: 0,0:11:55.56,0:12:00.21,Default,,0000,0000,0000,,cipher, ma qui voglio presentarne solo uno. Prima di tutto, i parametri per Dialogue: 0,0:12:00.21,0:12:04.03,Default,,0000,0000,0000,,questi stream cipher sono un pò diversi da quelli a cui siamo abituati. Questi Dialogue: 0,0:12:04.03,0:12:08.34,Default,,0000,0000,0000,,stream cipher di norma hanno un seme. Ma inoltre hanno anche ciò Dialogue: 0,0:12:08.34,0:12:12.82,Default,,0000,0000,0000,,che viene chiamato un nonce e vedremo come viene usato un nonce tra giusto un minuto. Quindi, Dialogue: 0,0:12:12.82,0:12:17.49,Default,,0000,0000,0000,,si prendono due input, un seme e un nonce. Vedremo come viene usato un nonce tra Dialogue: 0,0:12:17.49,0:12:21.27,Default,,0000,0000,0000,,giusto un secondo. Si produce ovviamente un output molto grande, quindi n è ora Dialogue: 0,0:12:21.27,0:12:26.60,Default,,0000,0000,0000,,molto, ma molto più grande di s. Ora, quando dico nonce, cosa intendo è un valore che non si ripeterà Dialogue: 0,0:12:26.60,0:12:31.22,Default,,0000,0000,0000,,mai finchè rimane fissata la chiave. Spiegherò tutto questo tin maggiori Dialogue: 0,0:12:31.22,0:12:35.40,Default,,0000,0000,0000,,dettagli tra giusto un secondo. Ma per ora, pensate solo ad esso come ad un valore unico che mai Dialogue: 0,0:12:35.40,0:12:40.53,Default,,0000,0000,0000,,si ripeta finchè la chiave è la stessa. E quindi, ovviamente, una volta che avete questo PRG (generatore pseudo-causale) Dialogue: 0,0:12:40.53,0:12:45.36,Default,,0000,0000,0000,,potrete cifrare e otenere uno stream cipher come prima, eccetto che ora, come vedete, il Dialogue: 0,0:12:45.36,0:12:49.96,Default,,0000,0000,0000,,PRG prende come input sia la chiave che il nonce. E la proprietà del nonce è Dialogue: 0,0:12:49.96,0:12:56.35,Default,,0000,0000,0000,,che la coppia (k,r), cioè (chiave,nonce) non si ripete mai. Non viene Dialogue: 0,0:12:56.35,0:13:03.10,Default,,0000,0000,0000,,mai usata più di una volta. Quindi la conclusione è che potete riusare la chiave, Dialogue: 0,0:13:03.10,0:13:09.71,Default,,0000,0000,0000,,riusare la chiave, perchè il nonce rende la coppia unica, perchè k ed r sono usati Dialogue: 0,0:13:09.71,0:13:16.14,Default,,0000,0000,0000,,solo una volta. Cioè sono unici. Ok, quindi questo nonce è qualcosa come uno stratagemma simpatico che Dialogue: 0,0:13:16.14,0:13:21.54,Default,,0000,0000,0000,,ci risparmia la necessità di utilizzare una nuova chiave ogni volta. ok, l'esempio particolare Dialogue: 0,0:13:21.54,0:13:26.00,Default,,0000,0000,0000,,che proviene da eStream che voglio mostrarvi è chiamato Salsa20. E' uno Dialogue: 0,0:13:26.00,0:13:30.29,Default,,0000,0000,0000,,stream cipher che è stato progettato per implementazioni sia hardware che software. Dialogue: 0,0:13:30.29,0:13:33.38,Default,,0000,0000,0000,,E' piuttosto interessante. Capite che alcni stream ciphers sono Dialogue: 0,0:13:33.38,0:13:38.76,Default,,0000,0000,0000,,progettati per implementazioni software, come RC4. Tutto ciò che fa è progettato per rendere Dialogue: 0,0:13:38.76,0:13:42.69,Default,,0000,0000,0000,,l'implementazione software molto veloce, mentre altri stream ciphers sono progettati Dialogue: 0,0:13:42.69,0:13:48.14,Default,,0000,0000,0000,,per l'hardware, come il CSS, usando un registro di scorrimento che è particolarmente progettato per rendere Dialogue: 0,0:13:48.14,0:13:50.96,Default,,0000,0000,0000,,l'implementazione hardware molto economica. La cosa interessante in questo senso è che Dialogue: 0,0:13:50.96,0:13:55.01,Default,,0000,0000,0000,,esso è progettato in modo che sia semplice da implementare in hardware e che la sua Dialogue: 0,0:13:55.01,0:13:59.75,Default,,0000,0000,0000,,implementazione software sia anche molto veloce. Quindi lasciatemi spiegare come funziona Salsa. Bene, Salsa Dialogue: 0,0:13:59.75,0:14:05.13,Default,,0000,0000,0000,,prende chiavi a 128 o a 256 bit. Spiegherò solo la versione di Salsa a 128 bit. Dialogue: 0,0:14:05.13,0:14:11.24,Default,,0000,0000,0000,,Quindi, questo è il seme. E prende anche un nonce, come prima, che Dialogue: 0,0:14:11.24,0:14:15.42,Default,,0000,0000,0000,,risulta essere di 64 bit. Quindi genera un output lungo. Ora, come funziona Dialogue: 0,0:14:15.42,0:14:21.06,Default,,0000,0000,0000,,realmente? Bene, la funzione stessa è definita nel modo seguente. Fondamentalmente, data Dialogue: 0,0:14:21.06,0:14:26.38,Default,,0000,0000,0000,,la chiave e il nonce, esso genererà una sequenza pseudorandom molto lunga. Dialogue: 0,0:14:26.38,0:14:31.22,Default,,0000,0000,0000,,cioè lunga quanto necessario. E lo farà usando questa funzione che chiamerò Dialogue: 0,0:14:31.22,0:14:35.65,Default,,0000,0000,0000,,H. Questa funzione H prende tre input. Fondamentalmente la chiave, il seme, Dialogue: 0,0:14:35.65,0:14:40.50,Default,,0000,0000,0000,,il nonce r e un contatore che incrementa passo passo. Cioè va Dialogue: 0,0:14:40.50,0:14:45.26,Default,,0000,0000,0000,,da zero a uno, due, tre, quattro finchè serve. Ok? Quindi, fondamentalmente, Dialogue: 0,0:14:45.26,0:14:49.96,Default,,0000,0000,0000,,calcolando questo H su questi k ed r, ma usando questo contatore incrementale, possiamo ottenere Dialogue: 0,0:14:49.96,0:14:54.88,Default,,0000,0000,0000,,una sequenza che è lunga quanto ci serve. Quindi, tutto ciò che devo fare è descrivere come funziona questa funzione Dialogue: 0,0:14:54.88,0:14:59.46,Default,,0000,0000,0000,,H. Ora, lasciatemi fare questo per voi. Il modo in cui funziona è il seguente. Bene, partiamo Dialogue: 0,0:14:59.46,0:15:04.69,Default,,0000,0000,0000,,espandendo gli stati in qualcosa di piuttosto largo che è lungo 64 byte Dialogue: 0,0:15:04.69,0:15:10.16,Default,,0000,0000,0000,,e lo facciamo nel modo seguente. Fondamentalmente prendiamo una costante all'inizio, quindi Dialogue: 0,0:15:10.16,0:15:15.55,Default,,0000,0000,0000,,c'è una tao di zero, fatta di quattro bytes, cioè è una costante di quattro byte. Le specifiche di Salsa vi Dialogue: 0,0:15:15.55,0:15:20.61,Default,,0000,0000,0000,,danno il valore per questa tao di zero. Quindi mettiamo k in 16 Dialogue: 0,0:15:20.61,0:15:25.47,Default,,0000,0000,0000,,bytes. Quindi mettiamo un'altra costante. Di nuovo di quattro byte. E, come ho detto, Dialogue: 0,0:15:25.47,0:15:30.80,Default,,0000,0000,0000,,la specifica specifica anche questa costante fissa. Quindi mettiamo Dialogue: 0,0:15:30.80,0:15:37.44,Default,,0000,0000,0000,,il nonce, che è di otto byte. Quindi mettiamo l'indice. Questo è il contatore zero, Dialogue: 0,0:15:37.44,0:15:43.06,Default,,0000,0000,0000,,uno, due, tre, quattro che è di nuovo fatto da otto byte. Quindi mettiamo un'altra costante Dialogue: 0,0:15:43.06,0:15:49.06,Default,,0000,0000,0000,,tau due, che sono altri quattro byte. Quindi mettiamo la chiave di nuovo, che fanno Dialogue: 0,0:15:49.06,0:15:54.71,Default,,0000,0000,0000,,altri sedici byte. E quindi infine mettiamo la terza costante, tau tre, che sono Dialogue: 0,0:15:54.71,0:15:59.95,Default,,0000,0000,0000,,altri quattro byte. Ok, quindi, come ho detto, se sommato tutto questo, vedete che ottenete 64 byte. Dialogue: 0,0:15:59.95,0:16:05.25,Default,,0000,0000,0000,,Quindi, fondamentalmente, abbiamo sepanso la chiave e il nonce e il contatore fino a 64 Dialogue: 0,0:16:05.25,0:16:10.89,Default,,0000,0000,0000,,byte. Fondamentalmente la chiave viene ripetuta due volte. E quindi quello che facciamo è applicare Dialogue: 0,0:16:10.89,0:16:16.32,Default,,0000,0000,0000,,la funzione. Chiamerò questa funzione h piccolo. Ok, qindi applichiamo questa funzione h piccolo. Dialogue: 0,0:16:16.32,0:16:21.66,Default,,0000,0000,0000,,E questa è una funzione che è uno a uno, quindi mappa 64 byte in 64 byte. E' Dialogue: 0,0:16:21.66,0:16:26.00,Default,,0000,0000,0000,,una funzione completamente invertibile, ok? Quindi, questa funzione h è, come ho detto, una Dialogue: 0,0:16:26.00,0:16:30.26,Default,,0000,0000,0000,,funzione invertibile. Quindi, dato l'iinput voi ottenete l'output e dato Dialogue: 0,0:16:30.26,0:16:34.91,Default,,0000,0000,0000,,l'output voi potete ritornare all'input. Ed è progettata specificatamente in questo modo, quindi è a - facilmente Dialogue: 0,0:16:34.91,0:16:39.55,Default,,0000,0000,0000,,implementabile in hardware e b- su un x86 è estremamente facile da implementare, perchè Dialogue: 0,0:16:39.55,0:16:44.20,Default,,0000,0000,0000,,x86 ha questo insieme di istruzioni SSE2 che supporta tutte le operazioni di cui avete bisogno per fare Dialogue: 0,0:16:44.20,0:16:48.62,Default,,0000,0000,0000,,questa funzione. Ed è molto, molto veloce. Di conseguenza, Salsa è uno stream cipher molto veloce. Dialogue: 0,0:16:48.62,0:16:52.76,Default,,0000,0000,0000,,E queste operazioni vengono fatte ancora e ancora. Quindi si applica la funzione Dialogue: 0,0:16:52.76,0:16:57.74,Default,,0000,0000,0000,,h ancora e si ottiengono altri 64 bytes. E via di seguito, fondamentalmente Dialogue: 0,0:16:57.74,0:17:05.32,Default,,0000,0000,0000,,lo si fa dieci volte. ok, l'intera operazione è quindi ripetere 10 volte, cioè applicare Dialogue: 0,0:17:05.32,0:17:17.96,Default,,0000,0000,0000,,10 volte la funzione h. Quindi, di per se stessa, non è in effetti molto random. Dialogue: 0,0:17:17.96,0:17:22.14,Default,,0000,0000,0000,,Non sembra random perchè, come abbiamo detto, H è completamente invertibile. Quindi dato Dialogue: 0,0:17:22.14,0:17:25.52,Default,,0000,0000,0000,,l'output finale, è mlto semplice invertire h e quindi tornare indietro agli input originali Dialogue: 0,0:17:25.52,0:17:31.83,Default,,0000,0000,0000,,e quindi verificare che l'input ha la struttura corretta. Quindi si fa un'altra Dialogue: 0,0:17:31.83,0:17:36.98,Default,,0000,0000,0000,,cosa, che è fondamentalmente un XOR tra gli input e gli output finali. In realtà, Dialogue: 0,0:17:36.98,0:17:42.40,Default,,0000,0000,0000,,scusate, non è uno XOR. è in effetti un'addizione. Quindi fate un'addizione parola per parola. Dialogue: 0,0:17:42.40,0:17:47.76,Default,,0000,0000,0000,,Quindi se ci sono 64 byte, fate un'addizione parola per parola a passi di 4 byte Dialogue: 0,0:17:47.76,0:17:52.98,Default,,0000,0000,0000,,e alla fine ottenete l'output di 64 byte e questo è tutto. Questo è l'intero generatore Dialogue: 0,0:17:52.98,0:17:57.18,Default,,0000,0000,0000,,pseudo-random. Quindi questa è l'intera funzione h piccolo. E, come ho Dialogue: 0,0:17:57.18,0:18:01.76,Default,,0000,0000,0000,,spiegato, questa intera costruzione è la funzione H grande. E quindi calcolate Dialogue: 0,0:18:01.76,0:18:06.01,Default,,0000,0000,0000,,H grande incrementando il contatore I da zero, uno, due, tre in avanti. E questo Dialogue: 0,0:18:06.01,0:18:10.41,Default,,0000,0000,0000,,vi fornirà una sequenza pseudo-casuale che è lunga quanto vi serve. E Dialogue: 0,0:18:10.41,0:18:15.32,Default,,0000,0000,0000,,fondamentalmente, non ci sono attacchi significativi su questo algoritmo. Questo ha una sicurezza che è Dialogue: 0,0:18:15.32,0:18:20.37,Default,,0000,0000,0000,,molto vicina a 2 alla 128. edremo cosa significa questo più tardi. Dialogue: 0,0:18:20.37,0:18:25.42,Default,,0000,0000,0000,,E' uno stream cipher molto veloce, sia in hardware che in software. E, per quanto possiamo dirne, Dialogue: 0,0:18:25.42,0:18:30.43,Default,,0000,0000,0000,,esso sembra impredicibile quanto richiesto per uno stream cipher. Quindi Dialogue: 0,0:18:30.43,0:18:34.80,Default,,0000,0000,0000,,dovrei dire che il progetto eStream effettivamente ha cinque stream cipher come Dialogue: 0,0:18:34.80,0:18:39.40,Default,,0000,0000,0000,,questo. Ho scelto Salsa20 perchè pernso sia il più elegante. Ma posso darvi Dialogue: 0,0:18:39.40,0:18:44.05,Default,,0000,0000,0000,,alcuni parametri di performance. Potete vedere che questi sonoparametri di performance su Dialogue: 0,0:18:44.05,0:18:48.77,Default,,0000,0000,0000,,una macchina x86 a 2.2 GHz. E potete vedere che RC4 è effettivmente Dialogue: 0,0:18:48.77,0:18:53.02,Default,,0000,0000,0000,,il più lento. Perchè essenzialmente, beh esso non sfrutta Dialogue: 0,0:18:53.02,0:18:57.48,Default,,0000,0000,0000,,l'hardware. Esso fa solo operazioni su byte. E quindi ci sono molti cicli sprecati Dialogue: 0,0:18:57.48,0:19:01.18,Default,,0000,0000,0000,,che non vengono utilizzati. Ma i candidati eStream, sia Salsa che l'altro dandidato Dialogue: 0,0:19:01.18,0:19:05.20,Default,,0000,0000,0000,,chiamato Sosemanuk, questi sono i finalisti eStream. Questi sono Dialogue: 0,0:19:05.20,0:19:09.59,Default,,0000,0000,0000,,in effetti gli stream ciphers che sono stati approvati dal progetto eStream. Potete vedere che Dialogue: 0,0:19:09.59,0:19:13.71,Default,,0000,0000,0000,,hanno raggiunto una velocità significativa. Questo è 643 MB/s su questa Dialogue: 0,0:19:13.71,0:19:18.15,Default,,0000,0000,0000,,architettura, più del necessario per un video e questi sono in effetti velocità piuttosto impressionanti Dialogue: 0,0:19:18.15,0:19:22.43,Default,,0000,0000,0000,,E quindi, ora avete visto esempi di due vecchi stream ciphers che non dovrebbero più essere usati, Dialogue: 0,0:19:22.43,0:19:26.66,Default,,0000,0000,0000,,compresi gli attacchi su questi stream ciphers. Avete anche visto come sono fatti i moderni stream ciphers Dialogue: 0,0:19:26.66,0:19:30.48,Default,,0000,0000,0000,,con questo nonce. E vedete i numeri di performance per questi Dialogue: 0,0:19:30.48,0:19:34.55,Default,,0000,0000,0000,,moderni stream ciphers. Quindi se vi capita di avere bisogno di uno stream cipher potreste usare uno dei Dialogue: 0,0:19:34.55,0:19:37.99,Default,,0000,0000,0000,,finalisti del progetto eStream. In particolare potreste usare qualcosa come Salsa.