Funzione pseudocasuale

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

Si consideri una famiglia di funzioni F : { 0 , 1 } n × { 0 , 1 } l ( n ) { 0 , 1 } l ( n ) , {\displaystyle F:\{0,1\}^{n}\times \{0,1\}^{l(n)}\to \{0,1\}^{l(n)},} dove il primo input è la chiave (una volta fissata la chiave k { 0 , 1 } n {\displaystyle k\in \{0,1\}^{n}} , si ha una funzione F k : { 0 , 1 } l ( n ) { 0 , 1 } l ( n ) {\displaystyle F_{k}:\{0,1\}^{l(n)}\to \{0,1\}^{l(n)}} ), dove l ( ) : N N {\displaystyle l(\cdot ):\mathbb {N} \to \mathbb {N} } . Per semplicità si può assumere l ( n ) = n {\displaystyle l(n)=n} .

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

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

Alcune varianti

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 F k {\displaystyle F_{k}} , ma con qualche limitazione.

Funzione pseudocasuale debole

L'attaccante ha accesso a un oracolo per F k {\displaystyle F_{k}} che campiona una stringa x {\displaystyle x} in modo uniforme e restituisce la coppia ( x , F k ( x ) ) {\displaystyle (x,F_{k}(x))} . A differenza della definizione originale, quindi, l'attaccante non ha il controllo sulle stringhe di input.

Funzione pseudocasuale non adattiva

L'attaccante può interrogare l'oracolo per F k {\displaystyle F_{k}} una sola volta, passando un numero arbitrario di stringhe x i {\displaystyle x_{i}} . L'oracolo restituisce F k ( x i ) , i {\displaystyle F_{k}(x_{i}),\forall i} . In questo caso, dunque, la scelta delle stringhe di input deve essere effettuata prima di vedere una qualunque stringa di output.

Funzione pseudocasuale sequenziale

L'attaccante accede all'oracolo che alla sua i {\displaystyle i} -esima invocazione restituisce F k ( i ) {\displaystyle F_{k}(i)} .

Permutazione pseudocasuale

Una funzione f {\displaystyle f} è 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

È 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

Dato un generatore pseudocasuale G : { 0 , 1 } n { 0 , 1 } 2 n {\displaystyle G:\{0,1\}^{n}\to \{0,1\}^{2n}} , è possibile creare una PRF F k : { 0 , 1 } n { 0 , 1 } n {\displaystyle F_{k}:\{0,1\}^{n}\to \{0,1\}^{n}} . In particolare, siano G 0 ( ) {\displaystyle G_{0}(\cdot )} e G 1 ( ) {\displaystyle G_{1}(\cdot )} rispettivamente la metà sinistra e la metà destra dell'output di G ( ) {\displaystyle G(\cdot )} . Data una chiave k {\displaystyle k} scelta uniformemente nell'insieme { 0 , 1 } n {\displaystyle \{0,1\}^{n}} e un input x = ( x 1 , x n ) {\displaystyle x=(x_{1},\dots x_{n})} di n {\displaystyle n} bit, si ha che F k ( x ) := G x n ( ( G x 2 ( G x 1 ( k ) ) ) {\displaystyle F_{k}(x):=G_{x_{n}}(\dots (G_{x_{2}}(G_{x_{1}}(k))\dots )} è una PRF.

Si noti che tale costruzione non è efficiente poiché richiede n {\displaystyle n} 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

Nel modello dell'oracolo casuale, assumendo quindi l'esistenza di un oracolo RO ( ) {\displaystyle {\texttt {RO}}(\cdot )} , è possibile definire una PRF nel seguente modo: F k ( x ) := RO ( k | | x ) {\displaystyle F_{k}(x):={\texttt {RO}}(k||x)}

Applicazioni

Cifrari simmetrici

Si può dimostrare[7] che una PRF è sufficiente per costruire un cifrario simmetrico Π {\displaystyle \Pi } che sia CPA-sicuro. Sia F ( ) : { 0 , 1 } n { 0 , 1 } n {\displaystyle F(\cdot ):\{0,1\}^{n}\to \{0,1\}^{n}} una PRF (eventualmente debole), allora Π = ( KGen , Enc , Dec ) {\displaystyle \Pi =({\texttt {KGen}},{\texttt {Enc}},{\texttt {Dec}})} con:

  • k KGen ( 1 n ) {\displaystyle k\leftarrow {\texttt {KGen}}(1^{n})} campiona una chiave k {\displaystyle k} di n {\displaystyle n} bit in modo uniforme
  • Enc k ( m ) = ( r , F k ( r m ) ) , r { 0 , 1 } n {\displaystyle {\texttt {Enc}}_{k}(m)=(r,F_{k}(r\oplus m)),r\in \{0,1\}^{n}} genera un crittotesto c {\displaystyle c} , campionando in modo uniforme una stringa r {\displaystyle r} di n {\displaystyle n} bit
  • Dec k ( c ) = Dec k ( c 1 , c 2 ) = F k ( c 1 ) c 2 {\displaystyle {\texttt {Dec}}_{k}(c)={\texttt {Dec}}_{k}(c_{1},c_{2})=F_{k}(c_{1})\oplus c_{2}} recupera il messaggio m {\displaystyle m}

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

Un'alternativa

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

Codici autenticatori di messaggio (MAC)

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]:

  • s Gen ( 1 n ) {\displaystyle s\leftarrow {\texttt {Gen}}(1^{n})} campiona una chiave segreta s {\displaystyle s} di n {\displaystyle n} bit in modo uniforme. Tale chiave è condivisa tra chi manda il messaggio (Alice) e chi lo riceve (Bob)
  • Tag s ( m ) = F s ( m ) {\displaystyle {\texttt {Tag}}_{s}(m)=F_{s}(m)} genera l'autenticatore ϕ {\displaystyle \phi }
  • Vrfy s ( m , ϕ ) {\displaystyle {\texttt {Vrfy}}_{s}(m,\phi )} verifica che ϕ {\displaystyle \phi } sia uguale a Tag s ( m ) {\displaystyle {\texttt {Tag}}_{s}(m)}

Un metodo molto semplice ed efficiente per generare chiavi crittografiche k i {\displaystyle k_{i}} consiste nel passare l'indice i alla funzione pseudocasuale, dopo aver generato una chiave s {\displaystyle s} : quindi, k i = F s ( i ) {\displaystyle k_{i}=F_{s}(i)} . Tale sistema si dimostra sicuro finché la chiave s {\displaystyle s} rimane privata e non viene compromessa.

Note

  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

  • Daniele Venturi, Crittografia nel Paese delle Meraviglie, collana UNITEXT, Springer Milan, 2012, DOI:10.1007/978-88-470-2481-6, ISBN 978-88-470-2480-9. URL consultato il 16 gennaio 2020.
  • (EN) Oded Goldreich, Foundations of Cryptography: Basic Tools, Cambridge, Cambridge University Press, 2001, ISBN 978-0-511-54689-1.
  • (EN) Jonathan Katz, Introduction to modern cryptography, Chapman & Hall/CRC, 2008, ISBN 978-1-58488-551-1, OCLC 137325053. URL consultato il 16 gennaio 2020.
  Portale Crittografia: accedi alle voci di Wikipedia che trattano di crittografia