it-swarm.it

Cos'è un oracolo crittografico?

Mi sono imbattuto nel termine "Oracle crittografico" e nonostante un po 'di ricerche su Google non sono riuscito a trovare una definizione chiara e concisa. Che cos'è un Oracle crittografico e cosa fa? Qualcuno può fare un esempio?

35
josh-cain

Un Oracle è un individuo che conosce il numero di cellulare personale di un dio. Ciò gli consente di ottenere alcune informazioni che di solito sono considerate fuori dalla portata dei semplici mortali, come gli scorci del futuro. Nella crittografia, è lo stesso, tranne per il fatto che non è coinvolta nessuna divinità: un Oracle è un sistema che può fornire alcune informazioni extra su un sistema, che altrimenti non sarebbe disponibile.

Ad esempio, considera la crittografia asimmetrica con RSA . Lo standard I link indica come un dato deve essere crittografato con una chiave pubblica. In particolare, la crittografia inizia con un'operazione di riempimento , in cui il pezzo di dati viene prima espanso aggiungendo un'intestazione, in modo che la lunghezza dei dati riempiti corrisponda la lunghezza della chiave pubblica RSA. L'intestazione dovrebbe iniziare con i due byte 0x00 0x02, seguito da almeno otto byte casuali diversi da zero, quindi da un altro 0x00. Una volta che i dati sono stati riempiti, è tempo di applicare l'operazione matematica che è al centro dell'operazione RSA (esponenziazione modulare). I dettagli dell'imbottitura sono importanti per la sicurezza.

Il risultato della crittografia è un intero modulo modulo RSA , un intero grande che fa parte della chiave pubblica. Per una chiave RSA a 1024 bit, il modulo n è un valore intero maggiore di 21023, ma inferiore a 21024. Un blocco dati crittografato correttamente, con RSA, fornisce un valore intero compreso tra 1 e n-1 . Tuttavia, il riempimento implica una struttura , come mostrato sopra. La parte decifratrice DEVE trovare, al momento della decodifica, un'intestazione PKCS # 1 correttamente formata, che inizia con la 0x00 0x02 byte, seguito da almeno otto byte diversi da zero e deve esserci un 0x00 che segna la fine dell'intestazione. Pertanto, non tutti i numeri interi tra 1 e n-1 sono validi RSA messaggio crittografato (meno di 1 ogni 65000 tali numeri interi genererebbero un corretto riempimento al momento della decrittazione).

Sapendo se un dato modulo intero n produrrebbe, dopo la decodifica, un struttura di imbottitura valida, si suppone che sia impossibile per chi non conosce la chiave privata. Il proprietario della chiave privata (la divinità) ottiene tali informazioni e molto altro: se la decodifica funziona, il proprietario della chiave privata riceve effettivamente il messaggio, che è il punto di decrittazione. Supponiamo che ci sia un'entità, da qualche parte, che può dirti se un dato modulo intero n è un dato crittografato validamente con RSA; quell'entità non ti darebbe il risultato completo della decrittazione, ti direbbe solo se la decrittazione funzionerebbe o meno. Queste sono informazioni a un bit, una visione ridotta di ciò che la divinità otterrebbe. L'entità è il tuo Oracle: restituisce parti delle informazioni che sono normalmente disponibili solo al proprietario della chiave privata.

risulta che, dato l'accesso a tale Oracle, è possibile ricostruire la chiave privata, inviando numeri interi appositamente predisposti modulo n (ci vogliono circa un milione di tali valori e un bel po 'di matematica, ma si può fare). Si scopre anche che la maggior parte SSL/TLS l'implementazione di quel tempo (che era nel 1999) agivano involontariamente come oracoli: se si inviava, come client, un messaggio ClientKeyExchange con crittografia RSA non valido, il server stava rispondendo con un messaggio di errore specifico ("duh, puzza il tuo messaggio ClientKeyExchange"), mentre se la decodifica funzionava, il server manteneva il protocollo, usando qualunque valore decodificasse (di solito sconosciuto al client se il client inviava un valore casuale , quindi il protocollo non è riuscito in seguito, ma il client potrebbe vedere la differenza tra un riempimento valido e uno non valido). Pertanto, con una tale implementazione, un utente malintenzionato potrebbe (dopo circa un milione di connessioni fallite) ricostruire la chiave privata del server, che di solito è considerata una cosa negativa.

Ecco cosa sono gli oracoli: una descrizione matematica di una perdita di dati, da utilizzare nelle prove di sicurezza. Nel caso di RSA, questo dimostra che sapere se un valore ha un corretto riempimento o meno equivale in qualche modo all'apprendimento della chiave privata (se si conosce la chiave privata è possibile tentare la decodifica e vedere il riempimento per conto proprio; l'attacco Bleichenbacher mostra che funziona anche al contrario).

67
Thomas Pornin

Un Oracle è qualcosa che può immediatamente (O(1)) darti la risposta ad un problema, di solito un problema impossibile o impossibile. Ad esempio, un "Halting-problem Oracle" potrebbe dirti immediatamente se un determinato programma su un determinato input si interrompe o meno, anche se il problema di arresto è non calcolabile a noi semplici mortali. Tuttavia, a volte possiamo dimostrare alcune proprietà utili fingendo che esistano determinati oracoli.

Nei documenti crittografici, ad esempio, gli oracoli vengono spesso utilizzati per dimostrare che, anche anche se i nostri aggressori hanno avuto accesso a qualche Oracle apparentemente impossibile, essi still non avrebbe alcun vantaggio (significativo) per infrangere la nostra sicurezza. Ad esempio, una proprietà importante degli algoritmi di crittografia (chiamata resistenza a noti attacchi di testo in chiaro ) è che se un utente malintenzionato riceve un messaggio crittografato con la chiave m' e vogliono conoscere il messaggio originale m (o capire la tua chiave), quindi dare loro un altro messaggio n e la sua crittografia con la tua chiave n' non dovrebbe aiutarli a farlo in alcun modo.

Portandolo all'estremo ( attacco di testo in chiaro scelto ): dai a un attaccante un Oracle in grado di crittografare o decrittografare any messaggio con il tuo chiave tranne per m e m'. Anche in queste condizioni estreme, vorremmo dimostrare per la nostra crittografia che l'attaccante con Oracle non avrà alcun vantaggio nel trovare m (o la tua chiave) dell'attaccante senza l'oracolo. Ciò significherebbe che la nostra crittografia è al sicuro da attacchi in chiaro.


[Edit]
Ecco un altro esempio pratico. Nella domanda n programma potrebbe mai dire se un altro programma gioca a scacchi , dimostriamo che non esiste un programma del genere ipotizzando prima che esista è un Oracle per il rilevamento degli scacchi, quindi mostrare la sua esistenza porta a un'impossibilità logica.

Gli oracoli crittografici sono un metodo di input/output in black box.

Risponderà a qualsiasi input con una risposta pseudo-casuale ma fornirà sempre lo stesso output per un input specifico.

Sono generalmente utilizzati per le funzioni hash in cui la casualità è importante per una maggiore sicurezza.

Ovviamente ci saranno ancora problemi di sicurezza in quanto è solo una funzione matematica che sta restituendo numeri apparentemente pseudo-casuali, ma sono ovviamente più forti di alcune delle loro controparti meno casuali.

Ecco un solido documento su di loro e sul loro design - http://cseweb.ucsd.edu/users/mihir/papers/ro.pdf

1
doyler