7.2.1. X9.82 Pseudo-Random Number Generation (Génération de nombres pseudo-aléatoires X9.82)
7.2.1. X9.82 Pseudo-Random Number Generation (Génération de nombres pseudo-aléatoires X9.82)
Le comité ANSI X9F1 est dans les étapes finales de création d'une norme pour la génération de nombres aléatoires couvrant à la fois les générateurs d'aléa véritable et les générateurs de nombres pseudo-aléatoires. Elle inclut un certain nombre de générateurs de nombres pseudo-aléatoires basés sur des fonctions de hachage, dont l'un sera probablement basé sur des constructions de hachage HMAC SHA [RFC2104]. La version provisoire de ce générateur est décrite ci-dessous, en omettant un certain nombre de caractéristiques optionnelles [X9.82].
Dans les sous-sections ci-dessous, la construction de hachage HMAC est simplement appelée HMAC mais, bien sûr, une fonction SHA standard particulière doit être sélectionnée dans une utilisation particulière. De manière générale, si la force des valeurs pseudo-aléatoires à générer doit être de N bits, la fonction SHA choisie doit générer N bits ou plus de sortie, et une source d'au moins N bits d'entropie d'entrée sera requise. La même fonction de hachage doit être utilisée tout au long d'une instanciation de ce générateur.
7.2.1.1. Notation
Dans les sections suivantes, la notation donnée ci-dessous est utilisée:
-
hash_lengthest la taille de sortie de la fonction de hachage sous-jacente en usage. -
input_entropyest la chaîne de bits d'entrée qui fournit l'entropie au générateur. -
Kest une chaîne de bits de taillehash_lengthqui fait partie de l'état du générateur et est mise à jour au moins une fois à chaque fois que des bits aléatoires sont générés. -
Vest une chaîne de bits de taillehash_lengthet fait partie de l'état du générateur. Elle est mise à jour chaque fois que des bits de sortiehash_lengthsont générés. -
"|" représente la concaténation.
7.2.1.2. Initialisation du générateur
Définir V à tous les octets zéro, sauf le bit de poids faible de chaque octet qui est défini à un.
Définir K à tous les octets zéro, puis définir:
K = HMAC ( K, V | 0x00 | input_entropy )
V = HMAC ( K, V )
K = HMAC ( K, V | 0x01 | input_entropy )
V = HMAC ( K, V )
Note: Tous les algorithmes SHA produisent un nombre intégral d'octets, donc les longueurs de K et V seront des nombres intégraux d'octets.
7.2.1.3. Génération de bits aléatoires
Lorsque la sortie est demandée, définissez simplement:
V = HMAC ( K, V )
et utilisez les bits de tête de V. Si plus de bits sont nécessaires que la longueur de V, définissez "temp" à une chaîne de bits nulle et répétez ensuite:
V = HMAC ( K, V )
temp = temp | V
en s'arrêtant dès que temp est égal ou plus long que le nombre de bits aléatoires demandés. Utilisez le nombre demandé de bits de tête de temp. La définition de l'algorithme interdit de demander plus de 2^35 bits.
Après avoir extrait et sauvegardé les bits de sortie pseudo-aléatoires comme décrit ci-dessus, avant de retourner vous devez également effectuer deux HMAC supplémentaires comme suit:
K = HMAC ( K, V | 0x00 )
V = HMAC ( K, V )