Provided by: manpages-fr-extra_20151231_all bug

NOM

       rand - Générateur de nombres pseudoaléatoires

SYNOPSIS

        #include <openssl/rand.h>

        int  RAND_set_rand_engine(ENGINE *engine);

        int  RAND_bytes(unsigned char *buf, int num);
        int  RAND_pseudo_bytes(unsigned char *buf, int num);

        void RAND_seed(const void *buf, int num);
        void RAND_add(const void *buf, int num, int entropy);
        int  RAND_status(void);

        int  RAND_load_file(const char *file, long max_bytes);
        int  RAND_write_file(const char *file);
        const char *RAND_file_name(char *file, size_t num);

        int  RAND_egd(const char *path);

        void RAND_set_rand_method(const RAND_METHOD *meth);
        const RAND_METHOD *RAND_get_rand_method(void);
        RAND_METHOD *RAND_SSLeay(void);

        void RAND_cleanup(void);

        /* Seulement pour Win32 */
        void RAND_screen(void);
        int RAND_event(UINT, WPARAM, LPARAM);

DESCRIPTION

       Depuis l’introduction de l’interface de programmation d'ENGINE, la manière recommandée de
       contrôler les implémentations par défaut est d’utiliser les fonctions d’interface de
       programmation d'ENGINE. La RAND_METHOD par défaut, telle que définie par
       RAND_set_rand_method() et renvoyée par RAND_get_rand_method(), n’est utilisée que si
       ENGINE a été défini comme implémentation « rand » par défaut. Par conséquent, ces deux
       fonctions ne sont plus recommandées pour contrôler les valeurs par défaut.

       Si une implémentation RAND_METHOD alternative est en cours d’utilisation (soit définie
       directement, soit fournie par un module d’ENGINE), alors elle est entièrement responsable
       de la génération et de la gestion d’un flux de génération de nombres pseudoaléatoires
       cryptographiquement sûr. Les mécanismes décrits ci-dessous ne reposent que sur
       l’implémentation de génération de nombres pseudoaléatoires intégrée à OpenSSL et utilisée
       par défaut.

       Ces fonctions implémentent un générateur de nombres pseudoaléatoires cryptographiquement
       sûr. Il est utilisé par d’autres fonctions de bibliothèques, par exemple pour générer des
       clefs aléatoires, et les applications peuvent l’utiliser quand elles ont besoin de hasard.

       Un générateur de nombres pseudoaléatoires cryptographique doit être initialisé avec des
       données non prévisibles comme des mouvements de souris ou des frappes aléatoires de
       touches par l’utilisateur. C’est décrit dans RAND_add(3). Son état peut être enregistré
       dans un fichier d’initialisation (consultez RAND_load_file(3)) pour éviter de recommencer
       le processus d’initialisation à chaque fois que l’application est démarrée.

       RAND_bytes(3) décrit comment obtenir des données aléatoires du générateur de nombres
       pseudoaléatoires.

FONCTIONNEMENT INTERNE

       La méthode RAND_SSLeay() implémente un générateur de nombres pseudoaléatoires basé sur une
       fonction de hachage cryptographique.

       La description suivante de sa conception est basée sur la documentation de SSLeay :

       Pour commencer, une déclaration des choses considérées nécessaires pour un bon générateur
       de nombres aléatoires.

       1.  Un bon algorithme de hachage pour mélanger les choses et convertir l’« état » du
           générateur en nombres aléatoires.

       2.  Une source de départ d’« état » de hasard.

       3.  L’état devrait être très grand. Si le générateur de nombres aléatoires est utilisé
           pour générer une clef RSA de 4096 bits, (au moins) deux chaînes aléatoires de
           2048 bits sont nécessaires. Si l’état du générateur de nombres aléatoires n’a que
           128 bits, l’espace de recherche est évidemment limité à 128 bits et non 2048. Ce
           dernier point est probablement exagéré, mais cela indique vraiment que garder beaucoup
           d’état du générateur de nombres aléatoires ne serait pas une mauvaise idée. Ce devrait
           être plus facile de casser un algorithme de chiffrement que de deviner les données
           d’initialisation du générateur de nombres aléatoires.

       4.  Toutes les données d’initialisation du générateur de nombres aléatoires devraient
           influencer tous les nombres aléatoires suivants générés. Cela implique que toutes les
           données aléatoires d’initialisation auront une influence sur tous les nombres
           aléatoires suivants générés.

       5.  Lors de l’utilisation des données pour initialiser l’état du générateur de nombres
           aléatoires, les données utilisées ne devraient pas pouvoir être extraites de l’état du
           générateur de nombres aléatoires. Ce devrait être impossible car une éventuelle source
           de données semi-aléatoires « secrètes » pourrait être une clef privée ou un mot de
           passe. Ces données ne doivent être dévoilées ni par un des nombres aléatoires
           suivants, ni par un déversement de la mémoire laissé par un plantage de programme.

       6.  À partir du même « état » initial, deux systèmes devraient dévier dans leur état du
           générateur de nombres aléatoires (et donc dans les nombres aléatoires générés) si
           possible.

       7.  À partir d’un flux de sortie de nombres aléatoires, il devrait être impossible de
           déterminer l’état du générateur de nombres aléatoires ou le nombre aléatoire suivant.

       L’algorithme est défini comme suit.

       Un état global constitué d’un tampon de 1023 octets (l’« état »), une valeur de hachage
       fonctionnelle (« md ») et un compteur (« compte »).

       À chaque fois que des données d’initialisation sont ajoutées, elles sont insérées dans
       l’« état » comme suit.

       L’entrée est découpée en morceaux de 20 octets (ou moins pour le dernier bloc). Chacun de
       ces blocs est passé dans la fonction de hachage comme suit : les données passées dans la
       fonction de hachage deviennent la « md » actuelle, le même nombre d’octets de l’« état »
       (la position est déterminée en bouclage incrémenté d’indice) en tant que « bloc » actuel,
       le nouveau « bloc » de données de clefs et « compte » (qui est augmenté après chaque
       utilisation). Ce résultat est gardé dans « md » et aussi ajouté à l’« état » à l’aide d’un
       XOR à l’endroit qui a été utilisé en entrée dans la fonction de hachage. Ce système
       devrait répondre aux points 1 (fonction de hachage, SHA-1 pour le moment), 3 (l’« état »),
       4 (par l’intermédiaire du « md ») et 5 (en utilisant une fonction de hachage et XOR).

       Lorsque des octets sont extraits du générateur de nombres aléatoires, le processus suivant
       est utilisé. Pour chaque groupe de 10 octets (ou moins), voici ce qui est fait.

       Entrer dans la fonction de hachage la « md » locale (qui est initialisée à partir de la
       « md » globale avant que des octets ne soient générés), les octets qui sont à écraser par
       les octets aléatoires et les octets de l’« état » (bouclage incrémenté d’indice). À partir
       de cette sortie hachée (qui est gardée dans « md »), les 10 premiers octets (au maximum)
       sont renvoyés à l’appelant et les 10 derniers octets sont ajoutés à l’« état » à l’aide
       d’un XOR.

       Enfin, après avoir fini « num » octets aléatoires de l’appelant, « compte » (qui est
       augmenté) et les « md » locale et globale sont introduits dans la fonction de hachage, et
       les résultats sont gardés dans la « md » globale.

       Ce qui précède devrait répondre aux points 1 (utilisation de SHA-1), 6 (en hachant dans
       l’« état » les « anciennes » données de l’appelant qui vont être écrasées) et 7 (en
       n’utilisant pas les 10 octets donnés à l’appelant pour mettre à jour l’« état », mais ils
       sont utilisés pour mettre à jour « md »).

       Ainsi, de tous les points soulevés, seul 2 n’est pas traité (mais consultez RAND_add(3)).

VOIR AUSSI

       BN_rand(3), RAND_add(3), RAND_load_file(3), RAND_egd(3), RAND_bytes(3),
       RAND_set_rand_method(3), RAND_cleanup(3)

TRADUCTION

       La traduction de cette page de manuel est maintenue par les membres de la liste
       <debian-l10n-french AT lists DOT debian DOT org>. Veuillez signaler toute erreur de
       traduction par un rapport de bogue sur le paquet manpages-fr-extra.