J'ai semé mon objet aléatoire sécurisé avec un nombre long. Maintenant, je veux extraire un autre nombre long. Mais il n'y a qu'une fonction appelée système.out.println (rangen2.nextlong ()); // généré par RANGEN2 P> résultat: p> suivantes (octet [] b) code> qui donne un octet aléatoire [] code>.
Y a-t-il un moyen d'obtenir un nombre long?
SHA1PRNG appears to produce the same values with the same seed
The default PRNG on this system is SHA1PRNG
4 Réponses :
Securerandom s'étend aléatoire et aléatoire a un Nextlong () code> méthode: http://docs.oracle.com/javase/6/docs/api/java/util/random.html#nextLong%28%29 a > p>
: Aléatoire a une valeur de graine de seulement 48 bits. Comment sera-t-il capable de générer un nombre arandom de 128 bits (qui est la taille de la sécurité aléatoire)?
@ user1139023 Vous pouvez simplement regarder la mise en œuvre. Mais c'est vraiment simple: concaténer plusieurs points de séquence ensemble pour obtenir un nombre plus long. Pour référence, il s'agit du code réel pour Nextlong () code>: retour ((long) (suivant (32)) << 32) + Suivant (32); Code>
@VOO: Parce que la classe aléatoire utilise une graine avec seulement 48 bits, cet algorithme ne retournera pas toutes les valeurs longues possibles. Reportez-vous à ce lien: Docs .oracle.com / Javase / 6 / Docs / API / Java / Util / ...
@downvoters: Je ne vois pas pourquoi ma réponse mérite un bowvote. Un SECURURANDOME génère autant d'octets que vous le souhaitez, et la graine n'est utilisée que pour l'initialiser. SécuritéDom a une méthode suivante () et renvoie une valeur longue aléatoire. Je ne vois pas pourquoi il ne pouvait pas être utilisé.
@ user1139023 Ouais .. Tout évidemment, la plus longue séquence possible d'une graine de 48 bits est de 2 ^ 48. Nous ne génèverons donc pas tous i> numéros possibles> 48bits, mais cela ne signifie pas que nous ne pouvons pas générer de chiffres de 64 bits ou 128 bits. C'est une différence.
@VOO: Vous avez raison, nous pouvons générer des numéros 64 bits, mais nous ne pourrons pas utiliser pleinement la gamme 128 bits.
@Jbnizet: Le lien que vous avez fourni indique que "car la classe aléatoire utilise une graine avec seulement 48 bits, cet algorithme ne retournera pas toutes les valeurs longues possibles." Mais je veux utiliser ma portée dans toute la mesure.
À l'exception de la graine et du moteur RNG est celui de SE SECURUDANDOM si vous utilisez un SECUURANDOM. Allez: Le nom est SE SE SE SE SECURANDOM, et il a une valeur suivante (). S'il n'était pas utilisable et n'était pas sécurisé, pensez-vous vraiment que la méthode serait là? Ou du moins, ne pensez-vous pas qu'il y aurait un grand avertissement rouge dans le Javadoc? Les ingénieurs du soleil sont plus intelligents que cela.
@Jbnizet: Vous dites que la gamme complète de 128 bits sera utilisée. Et je ne dis pas que les ingénieurs du soleil ne sont pas intelligents ou quelque chose du genre. Je voulais juste une réponse claire.
Oui, c'est ce que je dis. Lisez docs.oracle.com / Javase / 6 / Docs / API / Java / ... : génère un entier contenant le nombre spécifié par l'utilisateur de bits pseudo-aléatoires (justifié à droite, avec des zéros de premier plan). Cette méthode remplace une méthode Java.Util.random, et sert à fournir une source de bits aléatoires à toutes les méthodes héritées de cette classe (par exemple, Nextint, Nextlong et Suivantfloat). I>
révisé à nouveau, c'est la bonne réponse! (Et je devrais suivre mes propres conseils et lire la documentation plus attentivement) em> p>
est Ce ce que vous êtes utilisant? Si tel est le cas, il s'étend au hasard de sorte qu'il a une méthode héritée suivante (). Comme il remplace ensuite () toutes les méthodes aléatoires typiques utiliseront la méthode de PRNG SE SECUERANDOM. p>
(voir dans les commentaires Pourquoi ma deuxième réponse est incorrecte. ou plutôt inutile) p>
Je ne comprends pas complètement pourquoi la documentation aléatoire indique que la limitation de NextLong (), mais je pense que c'est une limitation de l'algorithme linéaire qu'il utilise (je pense que les algorithmes linéaires ont un cycle beaucoup plus court - c'est-à-dire quand ils commencent à répéter chiffres - que les PRNG modernes). Je pense que cela vaut la peine d'explorer sur Crypto Stack Exchange de curiosité. P>
Je suggérerais de créer longtemps en le composant simplement des 8 prochains octets ou de deux INT (retourné par suivant). Il n'y a aucun problème à faire cela et je ne vois aucune raison pour que vous ne puissiez pas toucher toutes les valeurs longues (pensez que l'une des deux moitiés de 32 bits peut avoir des valeurs de 0 à 2 ^ 32, avec égale probabilité) ou pourquoi on serait plus probable qu'un autre (ce qui signifierait que ce n'est pas pseudo-aléatoire). grève> p>
Aléatoire a une valeur de graine de seulement 48 bits. Comment sera-t-il capable de générer un nombre arandom de 128 bits (qui est la taille de la sécurité aléatoire)?
Les deux choses ne sont pas liées dans la façon dont vous semblez penser qu'ils sont. Un générateur de nombres pseudo-aléatoires peut produire une sortie de différentes tailles qui ne sont pas directement liées à la taille de la graine. Tout dépend de l'algorithme. Ce que votre graine fait vient d'ajouter entropie au système. Plus la gamme de valeurs de votre graine, plus vous pourrez obtenir, mais cela n'affecte pas la taille de la taille de la production. Les chiffres de flux sont un bon exemple de sortie pseudo-aléatoire qui est considérablement plus grande que la graine.
Pour les électeurs de bas: Pourriez-vous s'il vous plaît expliquer ce que vous pensez être faux avec ma réponse ou proposez une solution alternative?
Reportez-vous à ce lien Docs. oracle.com/javase/6/docs/api/java/util/...
Excellent, maintenant je comprends le problème! :) Je suggérerais alors que la meilleure façon de créer une valeur longue et de tirer pleinement parti des propriétés Securerandom consiste à le faire manuellement, à l'aide d'une méthode similaire à ce que la documentation indique pour NextLong () en aléatoire. La limitation que la documentation spécifie en ce qui concerne la taille de la graine est destinée à ce type d'algorithme, qui est obsolète et non vraiment en sécurité (voir, par exemple: Security.stackexchange.com/questions/4268/... ). Mettra à jour la réponse.
@ALEXFLORESU: Ce manuel de longue génération au hasard serait exactement ce que SE SE SECERTINEDANDA. Lisez docs.oracle.com / Javase / 6 / Docs / API / Java / Security / ... . SécuritéDom est nommé SECURANDANDOM pour de bonnes raisons. Si ses méthodes ne pouvaient plus être utilisées de manière sécurisée, il ne serait plus en sécurité.
Vous êtes absolument correct :) J'ai vu votre commentaire à votre réponse il y a une minute et j'ai raté cela dans la documentation. Mettra à jour la réponse à nouveau :)
BigInteger randomNumber = new BigInteger(numBits, random);
Remarque: avec aléatoire, une graine donnée produira toujours les mêmes résultats. Avec sa sécurité, ce ne sera pas. La graine ajoute juste au hasard.
Avez-vous déjà utilisé au hasard? L'ensemble du point de graine est de produire la même séquesnce de nombres. C'est également le cas avec aléatoire sécurisé. Deux nombres aléatoires sécurisés ensemencés avec la même valeur produisent la même séquence de nombres aléatoires. P> blockQuote>
xxx pré> impression p>
xxx pré> aller et essayez-le d'abord p> blockQuote>
Bon conseil, mais juste essayer, cela ne vous donne pas toujours toute la réponse dans ce cas. p> p>
@Peter Lawrey: Vous n'obtiendrez pas le même résultat. J'ai essayé votre exacte code et j'ai imprimé la sortie dans ma question. Allez le voir.
J'ai également exécuté le code de Peter et je reçois le type de sortie qu'il suggère; même graine, sortie différente. Donc, avant de commencer les doigts pointus de manière agressive, vous devez peut-être prendre un pas en arrière et penser à ce que nous manquons. Y a-t-il une différence de version ou quelque chose comme ça?
Je pense que je pensais que je l'ai compris (cet article a aidé: CIGITAL.com/Justice-league-League-Blog/2009/08/14/... ) Il semble que SE SE SE SE SE SE SE SE SE SE SE SE SE SE SIMPERATIVE DIFFÉRENTS Selon la mise en œuvre, pourquoi je devine que nous voyons différents résultats. J'ai été capable de reproduire le problème que certains d'entre vous voient (avec la même sortie pour différentes instances avec la même graine), si j'ai forcé SE SIMERAINANDOM d'utiliser le PRNT qui est par défaut sous Windows. Si je l'instanciate normalement (sur un Mac), je vois différentes sorties. Donc, si vous l'exécutez sous Windows ... vous y allez.
@ALEXFLORESU: Votre lien a été utile.
@ user1139023 J'ai mis à jour le code, je suppose que vous avez un algorithme par défaut différent sur votre système.
J'ai ajouté une réponse à votre commentaire.
@Peterlawrey: J'ai ajouté ma réponse à ma question.
@Peterlawrey: Où es-tu? J'ai essayé votre code aussi. Voir la sortie que j'ai obtenu pour votre code dans ma question.
@ user1166690: utilisez-vous Android? Androids Securerandom se comporte différemment de Java standard.
@RasmusFaber: Non Le code collé ci-dessus a été utilisé dans Java. Mais juste en dehors de la curiosité, pourquoi cela se comporterait-il différemment à Android.
@ user1139023, voir mon commentaire ci-dessous. Cela n'a pas lui-même une implémentation de PRNG, il utilise ce qui est disponible. À partir de la documentation: ce constructeur traverse la liste des fournisseurs de sécurité enregistrés, en commençant par le fournisseur le plus préféré. [..] Si aucun des fournisseurs ne prend en charge un algorithme RNG, un défaut spécifique à la mise en œuvre est renvoyé B>. "
@ user1166690 sur mon système il y a deux algorithmes. La valeur par défaut n'est pas entièrement basée sur la graine. C'est un autre qui est basé sur la graine.
@Peterlawrey: La valeur par défaut de mon système est SHA1PRNG. Qui est basé sur la graine.
Cela pourrait être utile de spécifier cet algorithme si vous en avez besoin au lieu de prendre la valeur par défaut.
Modérateur Note B> Veuillez garder des commentaires constructifs et sur sujet. I>
@RasmusFaber: Vous avez raison de semer la sécurité aléatoire avec le même numéro, des séquences numériques différentes sont générées en Java et Android, même si elles utilisent les deux "SHA1PRNG".