.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "fr::crypto::rand 3SSL" .TH fr::crypto::rand 3SSL "2015-12-31" "1.0.2a 1.0.2c" "OpenSSL" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NOM" .IX Header "NOM" rand \- Générateur de nombres pseudoaléatoires .SH "SYNOPSIS" .IX Header "SYNOPSIS" \&\fB #include \fR .PP \&\fB int RAND_set_rand_engine(\s-1ENGINE\s0 *\fR\fIengine\fR\fB);\fR .PP \&\fB int RAND_bytes(unsigned char *\fR\fIbuf\fR\fB, int\fR \fInum\fR\fB);\fR \fBint RAND_pseudo_bytes(unsigned char *\fR\fIbuf\fR\fB, int\fR \fInum\fR\fB);\fR .PP \&\fB void RAND_seed(const void *\fR\fIbuf\fR\fB, int\fR \fInum\fR\fB);\fR \fBvoid RAND_add(const void *\fR\fIbuf\fR\fB, int\fR \fInum\fR\fB, int\fR \fIentropy\fR\fB);\fR \fBint RAND_status(void);\fR .PP \&\fB int RAND_load_file(const char *\fR\fIfile\fR\fB, long\fR \fImax_bytes\fR\fB);\fR \fBint RAND_write_file(const char *\fR\fIfile\fR\fB);\fR \fBconst char *RAND_file_name(char *\fR\fIfile\fR\fB, size_t\fR \fInum\fR\fB);\fR .PP \&\fB int RAND_egd(const char *\fR\fIpath\fR\fB);\fR .PP \&\fB void RAND_set_rand_method(const \s-1RAND_METHOD\s0 *\fR\fImeth\fR\fB);\fR \fBconst \s-1RAND_METHOD\s0 *RAND_get_rand_method(void);\fR \fB\s-1RAND_METHOD\s0 *RAND_SSLeay(void);\fR .PP \&\fB void RAND_cleanup(void);\fR .PP /* Seulement pour Win32 */ \fBvoid RAND_screen(void);\fR \fBint RAND_event(\s-1UINT, WPARAM, LPARAM\s0);\fR .SH "DESCRIPTION" .IX Header "DESCRIPTION" Depuis l’introduction de l’interface de programmation d'\s-1ENGINE,\s0 la manière recommandée de contrôler les implémentations par défaut est d’utiliser les fonctions d’interface de programmation d'\s-1ENGINE.\s0 La \fB\s-1RAND_METHOD\s0\fR par défaut, telle que définie par \fBRAND_set_rand_method\fR() et renvoyée par \&\fBRAND_get_rand_method\fR(), n’est utilisée que si \s-1ENGINE\s0 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. .PP Si une implémentation \fB\s-1RAND_METHOD\s0\fR 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. .PP 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. .PP 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 \&\fBRAND_add\fR(3). Son état peut être enregistré dans un fichier d’initialisation (consultez \fBRAND_load_file\fR(3)) pour éviter de recommencer le processus d’initialisation à chaque fois que l’application est démarrée. .PP \&\fBRAND_bytes\fR(3) décrit comment obtenir des données aléatoires du générateur de nombres pseudoaléatoires. .SH "FONCTIONNEMENT INTERNE" .IX Header "FONCTIONNEMENT INTERNE" La méthode \fBRAND_SSLeay\fR() implémente un générateur de nombres pseudoaléatoires basé sur une fonction de hachage cryptographique. .PP La description suivante de sa conception est basée sur la documentation de SSLeay : .PP Pour commencer, une déclaration des choses considérées nécessaires pour un bon générateur de nombres aléatoires. .IP "1." 4 Un bon algorithme de hachage pour mélanger les choses et convertir l’« état » du générateur en nombres aléatoires. .IP "2." 4 Une source de départ d’« état » de hasard. .IP "3." 4 L’état devrait être très grand. Si le générateur de nombres aléatoires est utilisé pour générer une clef \s-1RSA\s0 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. .IP "4." 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. .IP "5." 4 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. .IP "6." 4 À 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. .IP "7." 4 À 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. .PP L’algorithme est défini comme suit. .PP Un état global constitué d’un tampon de 1023 octets (l’« état »), une valeur de hachage fonctionnelle (« md ») et un compteur (« compte »). .PP À chaque fois que des données d’initialisation sont ajoutées, elles sont insérées dans l’« état » comme suit. .PP 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 \s-1XOR\s0 à 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, \&\s-1SHA\-1\s0 pour le moment), 3 (l’« état »), 4 (par l’intermédiaire du « md ») et 5 (en utilisant une fonction de hachage et \s-1XOR\s0). .PP 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. .PP 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 \s-1XOR.\s0 .PP 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. .PP Ce qui précède devrait répondre aux points 1 (utilisation de \s-1SHA\-1\s0), 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 »). .PP Ainsi, de tous les points soulevés, seul 2 n’est pas traité (mais consultez \&\fBRAND_add\fR(3)). .SH "VOIR AUSSI" .IX Header "VOIR AUSSI" \&\fBBN_rand\fR(3), \fBRAND_add\fR(3), \&\fBRAND_load_file\fR(3), \fBRAND_egd\fR(3), \&\fBRAND_bytes\fR(3), \&\fBRAND_set_rand_method\fR(3), \&\fBRAND_cleanup\fR(3) .SH "TRADUCTION" .IX Header "TRADUCTION" La traduction de cette page de manuel est maintenue par les membres de la liste . Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.