Vai al contenuto

Funzione pseudocasuale

Da Wikipedia, l'enciclopedia libera.

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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

Permutazione pseudocasuale

[modifica | modifica wikitesto]

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 | modifica wikitesto]

È 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 | modifica wikitesto]

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 | modifica wikitesto]

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

Cifrari simmetrici

[modifica | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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 | modifica wikitesto]

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.

  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.
  Portale Crittografia: accedi alle voci di Wikipedia che trattano di crittografia