# Fortuna (cryptographie)

Fortuna est un générateur de nombres pseudo-aléatoires inventé par Bruce Schneier et Niels Ferguson et destiné à une utilisation cryptographique. Il a été nommé d'après Fortuna, la déesse romaine du hasard.
Plus précisément, Fortuna est une famille de générateurs cryptographiques de nombres pseudo-aléatoires. Sa conception est assez flexible quant à l'implémentation qui en est faite. Le générateur est divisé en plusieurs parties :
* le générateur lui-même qui une fois qu'il a reçu une graine produira une suite infinie
* l'accumulateur d'entropie qui récupère des données aléatoires à partir de diverses sources, il envoie une nouvelle graine au générateur lorsque l'entropie est suffisante
* le fichier des graines qui stocke suffisamment d'informations pour pouvoir commencer une génération de nombres dès que l'ordinateur a démarré
Le générateur est basé sur un algorithme de chiffrement par bloc. Dans Cryptographique pratique, Schneier suggère d'utiliser AES, Serpent ou Twofish. L'idée est d'employer l'algorithme de chiffrement en mode compteur, c’est-à-dire qu'il chiffre successivement les valeurs d'un compteur qui s'incrémente. Cette procédure n'est toutefois pas suffisante car le compteur a un nombre d'états fini et donc la séquence générée est également finie. C'est pourquoi la clé de chiffrement est périodiquement modifiée. Si plus de 1 mégaoctet de données est généré, alors la clé est automatiquement changée. La clé est également modifiée après chaque requête principale.
L'accumulateur d'entropie est conçu pour être résistant à une attaque par injection de données, sans toutefois utiliser des estimateurs d'entropie trop complexes et donc peu sûrs. On considère plusieurs groupes d'entropie, chaque source d'entropie va répartir ses informations dans les différents groupes de manière uniforme. L'idée principale derrière ce système est de produire une nouvelle graine en changeant à chaque fois de groupe. Plus formellement, lors de la n-ième création de la graine, le groupe k est utilisé seulement si 2$^k$ divise n. Autrement dit, le groupe k n'est utilisé que sur une durée de 1/2$^k$ par rapport au temps total. En augmentant k, les nouvelles graines sont envoyées moins fréquemment mais par contre, on accumulera plus d'entropie.
La génération de la graine se fait via deux hachages des groupes avec SHA-256, cette valeur est ensuite utilisée comme clé pour l'algorithme de chiffrement.

## Résistance

Le système est totalement vulnérable si l'attaquant peut contrôler toutes les sources d'entropie qui arrivent dans le système. Dans ce cas, il devient totalement déterministe et aucun algorithme ne peut résister à cette hypothèse. Si l'attaquant s'empare de quelques sources d'entropie, il y aura certains groupes dans l'accumulateur d'entropie qui pourront continuer à en collecter. Dès qu'ils seront prêts du point de vue statistique, une nouvelle graine sera produite. C'est pourquoi le système est résistant à une injection de données mais mettra un certain temps à s'en remettre, tout dépend de la taille des données frauduleuses envoyées et du nombre de sources compromises ainsi que le nombre de groupes.
Fortuna utilise 32 groupes et de ce fait, cette restriction empêche une génération d'une graine plus de 10 fois par seconde. À ce rythme, il faudrait 13 ans pour ne plus disposer de suffisamment de groupes. Cette durée semble suffisante pour Schneier et Ferguson. Pour les implémentations qui nécessiteraient de très grand taux de générations, on peut toujours augmenter le nombre de groupes.

## Différence entre Fortuna et Yarrow

Fortuna est une version améliorée de Yarrow, un autre générateur conçu par Schneier, Kelsey et Ferguson. La principale différence concerne l'accumulateur d'entropie. Yarrow nécessitait un mécanisme supplémentaire pour déterminer l'entropie qu'il recevait et n'utilisait que deux groupes. De plus, la fonction de hachage utilisée était une itération de SHA-1 (Yarrow-160) au lieu de deux itérations de SHA-256.