# Fonction pseudo-aléatoire

Une fonction pseudo-aléatoire (ou PRF pour pseudorandom function) est une fonction dont l'ensemble des sorties possibles n'est pas efficacement distinguable des sorties d'une fonction aléatoire. Il ne faut pas confondre cette notion avec celle de générateur de nombres pseudo-aléatoires (PRNG). Une fonction qui est un PRNG garantit seulement qu'une de ses sorties prise seule semble aléatoire si son entrée a été choisie aléatoirement. En revanche, une fonction pseudo-aléatoire garantit cela pour toutes ses sorties, indépendamment de la méthode de choix de l'entrée.
En cryptographie, ce genre de fonction est extrêmement important : il sert de brique de base à la conception de primitives cryptographiques, en particulier pour les algorithmes de chiffrement.

## Définition

Formellement, une fonction pseudo-aléatoire est une fonction ${\mathcal {F}}:{\mathcal {K}}\times {\mathcal {X}}\to {\mathcal {Y}}$, où ${\mathcal {K}}$ représente l'espace des clefs, ${\mathcal {X}}$ représente le domaine de la fonction et ${\mathcal {Y}}$ son image.
La définition de sécurité associée, est donnée par le fait que n'importe quel adversaire polynomial est incapable de distinguer entre la sortie de ${\mathcal {F}}(k,\cdot )$ de la sortie d'une fonction aléatoire sur le même domaine, conditionnée sur le choix de la clef $k\in {\mathcal {K}}$.

## Construction

L'existence de fonctions à sens unique est suffisante pour construire des fonctions pseudo-aléatoire. En effet il est possible de construire un générateur pseudo-aléatoire (PRG) à partir de fonctions à sens unique, et il est possible de construire une fonction pseudo-aléatoire à partir d'un générateur pseudo-aléatoire.

## Applications
### Chiffrement sémantiquement sûr

L'existence d'une fonction pseudo-aléatoire ${\mathcal {F}}$ rend possible la conception d'un schéma de chiffrement symétrique sémantiquement sûr par la construction qui suit. Intuitivement, elle consiste à utiliser la sortie de la fonction pseudo-aléatoire comme une sortie uniforme pour l'utiliser comme masque jetable. L'avantage réside en le fait que la clef n'est ici plus aussi longue que le message, mais va dépendre de la clef utilisée et de la taille de l'aléa (qui est dépendante de l'entrée de la fonction pseudo-aléatoire ${\mathcal {F}}$).
* Génération de la clef: Une clef $k\gets _{\$}{\mathcal {K}}$ est générée aléatoirement dans l'espace des clefs de la PRF.
* Chiffrer: Pour chiffrer un message $m$ sous la clef $k$, on calcule le message chiffré de la manière suivante:
** Tirer un aléa $r\gets _{\$}{\mathcal {X}}$.
** Renvoyer le message chiffré: $C=(r,F(k,r)\oplus m)$, où $\oplus$ représente le ou exclusif bit à bit.
* Déchiffrer: Pour déchiffrer un message $C=(c_{1},c_{2})$ avec la clef $k$, on calcule: $m'=F(k,c_{1})\oplus c_{2}$.
La correction se vérifie par le fait que $\oplus$ est involutif.
La sécurité s'obtient par réduction polynomiale depuis la sécurité du chiffrement pseudo-aléatoire. En d'autres termes, si un adversaire était capable de distinguer entre le schéma présenté ci-dessus et une chaîne aléatoire, alors on pourrait directement l'utiliser pour distinguer entre un message construit à l'aide d'une fonction pseudo-aléatoire d'une vraie fonction aléatoire, auquel cas le chiffré $(c_{1},c_{2})$ serait distribué uniformément sur l'espace des chiffrés (le ou exclusif d'une constante (ici un message)par une fonction uniforme est distribué comme une fonction uniforme).