Implémentation la plus rapide d'un vrai générateur de nombres aléatoires en C #
Que j'ai lu sur Aléatoire.Next() que pour "la sécurité cryptographique de nombre aléatoire adapté pour la création d'un mot de passe aléatoire" MSDN suggère RNGCryptoServiceProvider Classe
À ce que la vitesse de pénalité? Il ya une certaine manière la plus rapide d'obtenir de vrais nombres aléatoires?
EDIT:
Avec L'Aléatoire.Next (), je reçois un nouveau nombre aléatoire. Et avec...
byte[] randomNumber = new byte[1];
RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
Gen.GetBytes(randomNumber);
int rand = Convert.ToInt32(randomNumber[0]);
Je reçois un "cryptographique sécurisé de nombre aléatoire"
Je veux savoir si le code ci-dessus est rapide par rapport à "Aléatoire.Next()" et si il y a un moyen rapide pour obtenir les mêmes résultats, ok?
source d'informationauteur Click Ok
Vous devez vous connecter pour publier un commentaire.
La façon la plus simple pour répondre à votre question pourrait être de transformer votre question à l'envers.
Assumer que le CryptoServiceProvider mise en œuvre est titulaire de tous les avantages. Il est tout aussi rapide et utilise tout aussi peu de mémoire comme Aléatoire.Prochaine.
Alors pourquoi faire les deux implémentations existent?
Pourquoi avons-nous même Ont Aléatoire.Prochaine dans le cadre?
Regardez ce que nous savons à propos de la mise en œuvre. On génère cryptographique sécurisé de nombre aléatoire, l'autre ne fait pas de promesses.
Qui est plus simple? La génération de nombres aléatoires qui sont suffisamment aléatoires pour être utilisés en cryptographie, ou de générer des nombres qui, tout simplement, "regardez" au hasard, mais ne garantit rien d'autre?
Si il n'y a pas de coûts associés à la production de sécurité cryptographique nombres aléatoires, puis chaque générateur de nombre aléatoire.
Vous pouvez généralement supposer que les fonctions de bibliothèque standard sont conçus pour faire ce qu'il dit sur la boîte et le faire bien. Aléatoire.Suivant est conçu pour vous la prochaine nombre aléatoire dans une séquence de nombres pseudo-aléatoires aussi efficacement que possible.
CryptoServiceProvider est conçu pour générer des nombres aléatoires suffisamment solide pour être utilisé en cryptographie, et ne que aussi efficacement que possible. Si il y avait un moyen de le faire aussi efficacement comme Aléatoire.Ensuite, alors Aléatoire.Ensuite l'utiliser trop.
Votre question semble supposer des dommages au cerveau sur la partie du cadre des designers qu'ils en quelque sorte conçu un inutilement lente de fonction pour générer cryptographique sécurisé de nombres aléatoires, même si il y avait un moyen plus rapide.
Le moyen le plus rapide pour générer cryptographique sécurisé de nombres aléatoires est plus susceptible d'appel de la fonction conçue par des experts pour générer cryptographique sécurisé nombres aléatoires.
La règle d'or quand il s'agit de la sécurité et de la cryptographie trucs:
Jamais écrire votre propre.
Aller avec le niveau moyen de le faire et éviter de dangereuses optimisations.
Modifier à l'adresse de mise à jour question:
Utilisation
Random.Next
quand vous en avez besoin statistiquement aléatoire de numéros qui ne sont pas utilisés dans la sécurité sensible code etRNGCryptoServiceProvider
dans sensibles à la sécurité du code. Il n'est pas aussi rapide queRandom.Next
mais il a des performances acceptables. Vous devriez référence pour voir la différence réelle. Habituellement, il n'est pas judicieux de sacrifier la sécurité pour la performance.La "sécurité cryptographique de nombre aléatoire généré par votre exemple de code ne jamais être entre 0 et 255 inclus!
Si vous souhaitez retourner tous les possibles
Int32
valeurs, alors vous devriez utiliser 4 octets aléatoires. Votre code devrait ressembler à quelque chose comme ceci:Un rapide test sur mon (vieux-ish) de la machine suggère que
Random.Next
est environ 200 fois plus rapide que l'utilisationRNGCryptoServiceProvider
.Ce que vous devriez faire d'abord et avant tout, est d'apprendre les différences fondamentales entre un GNAPRNGet CSPRNG.
Seulement après cela devrait vous être de décider sur ce que vous avez vraiment besoin, et ce implémentations possibles pourrait être. En règle générale, cependant, vous devez juste accepter ce qui a été établi et s'est avérée être une bonne mise en œuvre.
Le seul moyen connu pour obtenir vraiment nombres aléatoires du matériel est lente; si vous essayez d'accélérer vos cheveux deviennent blanc, tombe dans les touffes, et le CNRC envoie des robots pour nettoyer votre salle de serveur.
Je suis avec Mehrdad sur celui-ci: ne pas essayer de rouler votre propre.
Une question secondaire, mais intéressant, c'est votre utilisation de "vrai" dans la question. De vrais nombres aléatoires n'existent pas dans le matériel ou le logiciel. Ils existent dans la "vraie vie", comme dans la désintégration radioactive ou de bruit sur une ligne, mais ne peut pas être généré par un programme. Par conséquent, veuillez noter jalf.com utilisation de "pseudo-" et cochez la case jcinacio de liens vers wikipédia.
Autant que je sache, un vrai générateur aléatoire ne sera jamais implémenté en C#. Cela ne peut être fait avec l'aide de matériel?
Un autre point qui n'a pas été mis en place:
PRNG va produire des résultats prévisibles compte tenu de la même valeur de départ. CSPRNG ne sera pas - il n'a pas de valeur de départ. Cela rend PRNGs (à un certain degré) adapté pour une utilisation dans cypher flux des algorithmes. Deux ordinateurs tenu de la même initialisation des vecteurs (utilisés comme valeurs de départ à une ou plusieurs PRNGs) peut réellement communiquer les uns avec les autres, en privé, à l'aide de la XORed résultat de la plaine de texte octets et la sortie de la tête de série PNG(s) utilisé.
Je ne dis pas qu'une telle mise en œuvre serait nécessairement être cryptographique sécurisé bien sûr; seulement qu'une telle mise en œuvre exigerait la prévisibilité d'un PRNG que CSPRNG n'offre pas.