Comment générer de grands nombres aléatoires C
Je suis à la recherche d'un moyen de produire de grands nombres aléatoires de l'ordre de 2^64 en C... (100000000 - 999999999), à utiliser dans un algorithme de chiffrement à clé publique (p et q).
Je ne veux pas générer un nombre inférieur à 2^64 (qui est, plus petit que 100000000).
Est-il quelque chose qui pourrait m'aider à faire cela?
2^64 est beaucoup plus grande que 999999999.
[100000000 - 999999999] est 900,000,000 des valeurs différentes. Ce sont des chiffres sont de l'ordre de 30 bits, pas 64.
[100000000 - 999999999] est 900,000,000 des valeurs différentes. Ce sont des chiffres sont de l'ordre de 30 bits, pas 64.
OriginalL'auteur gfppaste | 2011-10-27
Vous devez vous connecter pour publier un commentaire.
random() renvoie un long sur un système 64 bits doivent être 64 bits. Si vous êtes sur un système 32 bits, vous pouvez effectuer les opérations suivantes:
Bien sur une NIX système, vous pourriez lire /dev/random dans votre mémoire tampon:
Un
rand()
est limitée parRAND_MAX
qui pas nécessaire2^32
. Et, vous avez encore besoin de quelque chose pour passer àsrand()
./dev/random
fonctionnalité est également disponible sur autres plates-formes.Ce n'est pas s'assurer que l'exigence "je ne veux pas générer nombre plus petit que ... 100000000" est remplie.
Ajoutez la ligne
num = (num % (999999999 - 100000000)) + 100000000;
pour générer un nombre aléatoire de la limite inférieure de 100000000 et la limite supérieure de la 999999999.Mieux, mais maintenant les chiffres ci-dessus 805933941 (2^64 -1 mod 899999999) sont légèrement moins probable que les chiffres ci-dessous 😉
Sur mon pc
RAND_MAX
est2^31
, pas2^32
.OriginalL'auteur David M. Syzdek
Vous pouvez combiner deux de 4 octets aléatoires entiers pour produire une 8 octets:
Depuis
rand
retourneint
, etsizeof(int) >= 4
sur presque n'importe quelle plate-forme moderne, ce code devrait fonctionner. J'ai ajouté le<< 0
à l'intention plus explicite.Le masquage avec
0x00000000FFFFFFFF
et0xFFFFFFFF00000000
est pour éviter le chevauchement des bits dans les deux numéros en cassizeof(int) > 4
.MODIFIER
Depuis @Banthar a commenté que
RAND_MAX
n'est pas nécessairement2 ^ 32
, et je pense qu'il est assuré d'être au moins2 ^ 16
, vous pouvez le combiner quatre 2 octets juste pour être sûr:^
de combiner les nombres au lieu de|
, vous n'avez pas besoin de s'inquiéter à propos de l'effet de masque.Tout-en-un:
RAND_MAX
est très rare d'être2 ^ 32
. Il peut être(2 ^ 32) - 1
. Pourtant, même ce qui est rare. Plus il est probable même queINT_MAX
qui a une valeur commune de(2 ^ 31) - 1
ou(2 ^ 15) - 1
. C spécifieRAND_MAX
être au moins(2^15) - 1
, pas2 ^ 16
.OriginalL'auteur Blagovest Buyukliev
Vous êtes à la recherche pour un de chiffrement-force PRNG, comme
openssl/rand
: http://www.openssl.org/docs/crypto/rand.html+1: à l'aide de
rand()
car c'est un trou de sécurité (la prévision de la sortie derand()
n'est pas très difficile)openssl.org/docs/crypto/rand.html lien mort en Août 2018. L'un des problèmes avec un lien unique réponse.
OriginalL'auteur wkl
Je sais que je vais probablement obtenir b____giflé par OliCharlesworth, mais utiliser rand() avec une échelle et de décalage. C'est dans stdlib.h afin de couvrir l'ensemble de la gamme vous devez l'ajouter à un autre plus petit rand() pour combler les lacunes dans la cartographie.
OriginalL'auteur MartyTPS
Vous pouvez faire un grand nombre
L
de plus petits nombres (par exemple,A
&B
). Par exemple, avec quelque chose commeL = (2^ n)*A + B
où ^ désigne l'exponentiation etn
est une constante de type entier (p. 32). Ensuite, vous code1<<n
(bit à bit décalage vers la gauche) pour la puissance de 2 de l'opération.De sorte que vous peut faire un grand nombre aléatoire de petits nombres aléatoires.
L, n, A, and b
veux dire? pourriez vous m'expliquer s'il vous plaît?En supposant de plus petits nombres
u32
sont uniformément réparties, est un nombre combinéu64 = (u32 << 32) | u32
aussi?Je suppose que oui, mais vous devriez demander à un mathématicien.
L = (2^ n)*A + B
est un problème si la plage deB
n'est pas [0...(2^ n)-1]. Mieux utiliserL = (2^ n)*A ^ B
siB
gamme est plus large (et toujours une puissance de 2). Le mieux est deL = (max_possible_value_of_B + (type_of_L)1) *A + B
OriginalL'auteur Basile Starynkevitch
Ou, vous pouvez utiliser deux générateurs de nombres aléatoires INDÉPENDANTES les graines et les mettre à leur sortie des numéros ensemble, comme l'a suggéré. Cela dépend si vous voulez une version 64 bits d'un générateur de nombres aléatoires avec une période de l'ordre de 2^64. Il suffit de ne pas utiliser la valeur par défaut d'appel, qui dépend du temps, parce que vous allez obtenir les mêmes graines pour chaque générateur. Le droit chemin, je ne sais pas ...
OriginalL'auteur jwoods486