Funzione pseudocasuale

famiglia di funzioni computazionalmente indistinguibile da funzioni veramente random

In crittografia, una famiglia di funzioni pseudocasuali, o più semplicemente una famiglia PRF (dall'inglese pseudorandom function family), è un insieme di funzioni calcolabili in modo efficiente, tali che nessun algoritmo efficiente possa distinguere (se non con vantaggio trascurabile) tra una funzione scelta casualmente dalla famiglia PRF e una vera funzione casuale. Le funzioni pseudocasuali sono strumenti vitali nella costruzione di molte primitive crittografiche, in particolare i cifrari sicuri; in questo caso si fa spesso riferimento a una particolare sottoclasse delle funzioni pseudocasuali, ovvero le permutazioni pseudocasuali (spesso abbreviate in PRP).

Nelle applicazioni pratiche, i cifrari a blocchi vengono utilizzati nella maggior parte dei casi in cui è necessaria una funzione o una permutazione pseudocasuale; in generale, essi non costituiscono una famiglia di funzioni pseudocasuali, poiché i cifrari a blocchi come AES sono definiti solo per un numero limitato di dimensioni di input e chiave[1].

Definizione formale modifica

Si consideri una famiglia di funzioni   dove il primo input è la chiave (una volta fissata la chiave  , si ha una funzione  ), dove  . Per semplicità si può assumere  .

Una tale famiglia di funzioni è pseudocasuale se sono soddisfatte le seguenti condizioni:

  • Per ogni scelta di   e  , esiste sempre un algoritmo efficiente (in tempo polinomiale) per calcolare  .
  • Sia   la distribuzione uniforme sull'insieme di tutte le funzioni che mappano stringhe di   bit in stringhe di   bit. Si richiede che   e   siano indistinguibili dal punto di vista computazionale, dove con   si indica il parametro di sicurezza. Cioè, per qualsiasi avversario che può interrogare l'oracolo di una funzione campionata da   o  , il vantaggio che può distinguere quale tipo di oracolo gli viene dato è trascurabile[2].

Alcune varianti modifica

In alcuni contesti è preferibile considerare definizioni più deboli di pseudocasualità; in particolare, si possono definire alcune varianti nelle quali l'attaccante ha accesso a un oracolo per  , ma con qualche limitazione.

Funzione pseudocasuale debole modifica

L'attaccante ha accesso a un oracolo per   che campiona una stringa   in modo uniforme e restituisce la coppia  . A differenza della definizione originale, quindi, l'attaccante non ha il controllo sulle stringhe di input.

Funzione pseudocasuale non adattiva modifica

L'attaccante può interrogare l'oracolo per   una sola volta, passando un numero arbitrario di stringhe  . L'oracolo restituisce  . In questo caso, dunque, la scelta delle stringhe di input deve essere effettuata prima di vedere una qualunque stringa di output.

Funzione pseudocasuale sequenziale modifica

L'attaccante accede all'oracolo che alla sua  -esima invocazione restituisce  .

Permutazione pseudocasuale modifica

Una funzione   è una permutazione pseudocasuale se:

  • è una funzione pseudocasuale
  • è biettiva

Nel 1988 Luby e Rackoff hanno dimostrato che è possibile costruire permutazioni pseudocasuali "forti" a partire da funzioni pseudocasuali[3]. La costruzione, che prende il nome degli autori, si basa sulla rete di Feistel.

Costruzioni teoriche modifica

È stato dimostrato che le funzioni pseudocasuali esistono se e solo se esistono le funzioni unidirezionali (one-way)[4].

Una famiglia di funzioni pseudocasuali può essere costruita da qualsiasi generatore pseudocasuale (o PRG), usando, ad esempio, la costruzione GGM, che prende il nome da Goldreich, Goldwasser e Micali[5].

Costruzione GGM modifica

Dato un generatore pseudocasuale  , è possibile creare una PRF  . In particolare, siano   e   rispettivamente la metà sinistra e la metà destra dell'output di  . Data una chiave   scelta uniformemente nell'insieme   e un input   di   bit, si ha che

 
è una PRF.

Si noti che tale costruzione non è efficiente poiché richiede   invocazioni in sequenza del PRG sottostante. Un'alternativa è stata fornita da Naor e Reingold[6] nel 1997: la loro costruzione, tuttavia, si basa sui sintetizzatori pseudocasuali, un oggetto crittografico apparentemente più difficile da istanziare rispetto a un PRG.

Costruzione nel modello del Random Oracle modifica

Nel modello dell'oracolo casuale, assumendo quindi l'esistenza di un oracolo  , è possibile definire una PRF nel seguente modo:

 

Applicazioni modifica

Cifrari simmetrici modifica

Si può dimostrare[7] che una PRF è sufficiente per costruire un cifrario simmetrico   che sia CPA-sicuro. Sia   una PRF (eventualmente debole), allora   con:

  •   campiona una chiave   di   bit in modo uniforme
  •  genera un crittotesto  , campionando in modo uniforme una stringa   di   bit
  •   recupera il messaggio  

La dimostrazione che il precedente schema sia CPA-sicuro si basa su una riduzione alla sicurezza di  : se, infatti, esistesse un attaccante efficiente in grado di rompere   in un gioco CPA, allora si potrebbe anche distinguere con un algoritmo efficiente   da una funzione veramente casuale.

Un'alternativa modifica

La costruzione proposta presenta un crittotesto di lunghezza doppia rispetto all'input. Si può fare a meno di inviare   se si adotta una modalità contatore: viene campionata una e una sola volta una stringa   di   bit in modo uniforme. Quando si vuole cifrare un messaggio si incrementa il contatore   da passare all'algoritmo  . Tale soluzione richiede che le due controparti mantengano uno stato (il valore di  ) per poter funzionare in modo corretto.

Codici autenticatori di messaggio (MAC) modifica

Una delle applicazioni più naturali e immediate delle funzioni pseudocasuali è la costruzione dei codici autenticatori di messaggio (o semplicemente MAC). La seguente costruzione è dovuta a Goldreich, Goldwasser e Micali[8]:

  •   campiona una chiave segreta   di   bit in modo uniforme. Tale chiave è condivisa tra chi manda il messaggio (Alice) e chi lo riceve (Bob)
  •   genera l'autenticatore  
  •   verifica che   sia uguale a  

Derivazione di una chiave modifica

Un metodo molto semplice ed efficiente per generare chiavi crittografiche   consiste nel passare l'indice i alla funzione pseudocasuale, dopo aver generato una chiave  : quindi,  . Tale sistema si dimostra sicuro finché la chiave   rimane privata e non viene compromessa.

Note modifica

  1. ^ Katz 2008, p. 88.
  2. ^ Goldreich, def. 3.6.4.
  3. ^ (EN) Michael Luby e Charles Rackoff, How to Construct Pseudorandom Permutations from Pseudorandom Functions, in SIAM Journal on Computing, vol. 17, n. 2, 1988-04, pp. 373–386, DOI:10.1137/0217022. URL consultato il 9 maggio 2020.
  4. ^ Johan HÅstad, Russell Impagliazzo e Leonid A. Levin, A Pseudorandom Generator from any One-way Function, in SIAM Journal on Computing, vol. 28, n. 4, 1º gennaio 1999, pp. 1364–1396, DOI:10.1137/S0097539793244708. URL consultato il 23 marzo 2020.
  5. ^ (EN) Oded Goldreich, Shafi Goldwasser e Silvio Micali, How to construct random functions, in Journal of the ACM, vol. 33, n. 4, 10 agosto 1986, pp. 792–807, DOI:10.1145/6490.6503. URL consultato il 16 gennaio 2020.
  6. ^ M. Naor e O. Reingold, Number-theoretic constructions of efficient pseudo-random functions, in Proceedings 38th Annual Symposium on Foundations of Computer Science, IEEE Comput. Soc, 1997, pp. 458–467, DOI:10.1109/SFCS.1997.646134. URL consultato il 23 marzo 2020.
  7. ^ Venturi, p. 114.
  8. ^ (EN) Oded Goldreich, Shafi Goldwasser e Silvio Micali, On the Cryptographic Applications of Random Functions (Extended Abstract), in Advances in Cryptology, Springer, 1985, pp. 276–288, DOI:10.1007/3-540-39568-7_22. URL consultato il 23 marzo 2020.

Bibliografia modifica

  Portale Crittografia: accedi alle voci di Wikipedia che trattano di crittografia